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.