Git alt modüllerinin izlenmemiş durumundan nasıl kurtulurum?


149

Git'in alt modüllerindeki izlenmemiş içerikten kurtulamıyorum. Koşu git statusverimi:

# Şube yöneticisi
# Taahhüt için gerçekleştirilmeyen değişiklikler:
# (taahhüt edilenleri güncellemek için "git add ..." kullanın)
# (çalışma dizinindeki değişiklikleri silmek için "git checkout - ..." kullanın)
# (alt modüllerdeki izlenmemiş veya değiştirilmiş içeriği taahhüt edin veya atın)
#
# değiştirildi: paket / snipmate (izlenmeyen içerik)
# değiştirildi: grupla / surround (izlenmeyen içerik)
# değiştirildi: paket / sondaki boşluk (izlenmeyen içerik)
# değiştirildi: paket / zencoding (izlenmeyen içerik)
#
taahhütte değişiklik yapılmadı ("git add" ve / veya "git commit -a" kullanın)

--ignore-submodulesParametrenin eklenmesi bu mesajları gizler; ama merak ediyorum ki bu kirden daha uygun, özlü bir şekilde kurtulmanın bir yolu var mı?


3
Bu cevap: stackoverflow.com/a/5127213/199649 daha fazla seçenek çağrıştırıyor.
— charlax

Yanıtlar:


95

Git durumu izlenmeyen içeriği bildirdiğinden, temiz bir duruma sahip olmanın gerçek yolu bu alt modüllerin her birine gitmek ve:

  • izlenmemiş içerikleri ekleyip taahhüt edin,
  • veya .gitignoreher bir modüle özgü izlenmemiş içeriğe referansta bulunabilirsiniz .
  • ya da alt modülü en aynı göz ardı içerik ekleyebilir .git/info/excludeolarak, peci1 raporları yorumlarda .
  • belirtildiği gibi ya da alt modül tarifnamede kirli eklemek ezraspectre sitesindeki yanıt (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • veya genel bir .gitignore dosya ekleyin (genellikle ~/.gitignore-global). Örneğin gibi .DS_Storeya da benim durumumda Carthage/Buildtarafından bildirilen Marián Cerny de yorumların . Bkz. .gitginoreSayfa :

Bir kullanıcının Git'in her durumda yoksaymasını istediği kalıplar (örneğin, kullanıcının seçtiği düzenleyici tarafından oluşturulan yedekleme veya geçici dosyalar) genellikle core.excludesFilekullanıcının belirttiği dosyaya gider ~/.gitconfig. Onun varsayılan değerdir $XDG_CONFIG_HOME/git/ignore. Eğer $XDG_CONFIG_HOMEikisinden biri ayarlamak veya boş değil, $HOME/.config/git/ignorebunun yerine kullanılır.


5
+1, bunu bulana kadar çığlık atmaya hazırdım ... daha sonra .DS_Storealt modüllerimden birinde otomatik olarak (OS X tarafından) bir dosya oluşturulduğunu fark ederek ana projeyi yürütmemi engelledim. Arg! Güncelleme zamanı .gitignore...
— Courtney Christensen

Xcode kullanarak, .gitignore-global dosyasına * .xcuserdatad eklemeyi de yararlı buldum. Bu git'in yerel Xcode tercihlerini izlemeye çalışmasını önler.
— Roy Sharon

Alt modül için itme haklarınız yoksa, alt modüldeki değişikliklerinizi üst repodaki diğer kullanıcılarla paylaşamazsınız. @ quincyglenn'in çözümü böyle bir durumda işe yarıyor gibi görünüyor.
— Drew Noakes

1
@VonC, ya duruma ve tercihe bağlı olarak cevap mantıklıdır. Buradaki ayrımı başkalarına referans olarak vurgulamak istedim. BTW Burada Git ile ilgili birçok cevabınız için teşekkürler SO - bana bir çok kez yardımcı oldunuz.
— Drew Noakes

2
Hatta bir .gitignore (ve kendisi izlenir hale) oluşturmadan ve hatta yapmadan yapabilirsiniz. .git/info/excludeAlt modülü açın ve yoksayma satırlarını buraya ekleyin (.gitignore gibi çalışır, ancak paylaşılan deponun bir parçası değildir).
— Martin Pecka

144

Bu blog gönderisini genel olarak çalışmak için buldum . Dosyadaki ignore = dirtygirdilerin her birine seçenek ekleyerek .gitmodules.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

Kolayca otomatikleştirildiği için tercih ettiğim çözüm.
— ölümcül gitar

24
ignore = untrackedAyrıca bahsetmeye değer , değiştirilmiş izlenen dosyaları gösterir, ancak izlenmeyen dosyaları göstermez. Tüm alt modüller için küresel bir ayar olsaydı iyi olurdu ...
— naught101

12

Ayrıca her bir alt modül dizinine gidebilir ve ayrılmış bir git gibi davranabilirsiniz. Örneğin:

cd my/project/submodule
git status

... / değiştirilen dosyaların listesini alır /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

Uzak alt modül deponuzu aşağıdakilerle de güncelleyebilirsiniz:

git submodule update

hepsinden sonra


5
Muhtemelen git add .değiştirilmiş dosyaları gözden geçirmeden yapmak istemezsiniz . Çoğu zaman, yapılan değişiklikler eklenen .DS_Storedosyalardır - .gitignorecevabın ilk yorumunda zourtney'in belirttiği gibi, muhtemelen sizin tarafınızdan yakalanmalıdır .
— gregoltsov

Alt modülleri gerçekten güncellemek istemediğiniz ve orijinal duruma geri dönmek istemiyorsanız, çalıştırmak isteyebilirsiniz git submodule update --force.
— Tom

4

Bunun nedeni detached HEADalt modül dalınızdaki olabilir. Bu durumda, alt modül yolunuza gidin (örneğin:) ./bundle/snipmate, ardından çalıştırın git checkout master.


2

Bu konuya dün 12'ye yakın alt modüle sahip bir projede takıldım.

git status çıktı gösteriyordu.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

İzlenmemiş içerik hatasını gidermek için, izlenmeyen dosyaları bir alt kullanarak tüm alt modüllerden (hepsi *.pyc, *.pyopython tarafından oluşturulan dosyalar) kaldırmak zorunda kaldım .gitignore.

Diğerini çözmek git submodule updateiçin alt modüllerin her birini güncelleyen çalıştırmak zorunda kaldım .


1

Benim durumumda ZF2 ortamımda yeni bir modül için başlangıç ​​noktası olarak modülleri klonluyorum. Bunun yaptığı dizine kendi .git klasörünü koymaktır.

Bu durumda çözüm .git klasörünü silmektir (görüntülemek için gizli dosyaları göstermeniz gerekecektir).


1

Bu muhtemelen belirli bir klasör içinde başka bir .git [gizli klasör] varsa olur.

değiştirildi: ./../ .. (değiştirilmiş içerik, izlenmemiş içerik)

alt dizininizin bu .git klasörünü içermediğinden emin olun.

Bu durumda, .git klasörü alt dizinden el ile silinerek sorun çözülebilir.


1

SourceTree kullanmayı tercih ediyorum , bu yüzden benim için çözüm SourceTree'de alt modül repo'yu açmak için bana izlenen tüm dosyaların listesini gösteriyor. Daha sonra hepsini seçtikten sonra "Kaldır" ı kullandım.

Bunu yapabildim çünkü izlenmeyen tüm dosyalara gerçekten ihtiyaç olmadığını biliyordum.


1

Bu benim için iyi sonuç verdi:

git update-index --skip-worktree <path>

İle çalışmazsa pathname, dosya adını deneyin. Bunun sizin için de işe yarayıp yaramadığını bana bildirin.


-1

Bu geçici bir sorunsa, alt modül klasörüne gidip çalıştırabilirsiniz, git reset HEAD --hardancak alt modül içindeki tüm değişikliklerinizi kaybedersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.