Git submodule ve subtree arasındaki farklar


Yanıtlar:


177

Bağlantıların her zaman harici repo BAŞKANI'na işaret etmesini istersem ne olur?

Bir alt modül uzak deposunun bir dalının HEAD'ini takip etmek için bir alt modül yapabilirsiniz:

o git submodule add -b <branch> <repository> [<path>]. (izlenecek bir dal belirtmek için)
o git submodule update --remotealt modülün içeriğini <repository>/<branch>varsayılan olarak en son HEAD'e güncelleyecektir origin/master. Ana projeniz yine --remotede kullanılsa bile alt modülün HEH'lerinin karmasını izleyecektir .



cevabınız burada oylanan cevaba karşı çıkıyor gibi görünüyor: stackoverflow.com/questions/10443627/…
Nathan H

@NathanH this (HEAD'ı izleme imkanı) bir yıl sonra eklendi (Mart 2013, git 1.8.2: github.com/git/git/blob/… )
VonC

Modül takip davranışının diğer cevaplarınızda da belirtildiğini görüyorum . Bu durumda ben her zaman bir altmodülün BAŞ işaret ikisini de kullanarak gerçekleştirilir söylemek demek düşünüyorum add -bve --remotegereği, bundan sonra güncelleme komutları üzerinde alt modül güncelleme belgelerine . Bu durumda, -byüksek lisans başlığını izlemek için gerçekten gerekli mi?
matanster

@matt the -b, alt modül için doğru .gitmodule meta verilerini üretmek için kullanılır (a'ya eşdeğerdir git config -f .gitmodules submodule.<path>.branch <branch>).
VonC

Daha sonra etkinleştirmeyle ilgisi yoktur --remote- --remoteeğer -bkullanılmamışsa da çalışır add. Her iki durumda da güncelleme, alt modülü barındıran ana repoda bir taahhüde neden olacaktır, bu nedenle bağlantılar gerçekten "her zaman HEAD'i çok otomatik bir şekilde göstermez" .... ya ben anlamadım ya da bu iddia orijinal yanıttan daha iyi kaldırılmalı (?)
matanster

351

alt modül bağlantıdır;

alt ağaç kopyadır


121

Kavramsal fark:

Git alt modülleri ile büyük bir depoyu daha küçük olanlara ayırmak istersiniz. Bir alt modüle referans vermenin yolu maven tarzındadır - diğer (alt modül) havuzundan tek bir işleme atıfta bulunuyorsunuz. Alt modül içinde bir değişikliğe ihtiyacınız varsa, alt modül içinde bir taahhüt / itme yapmanız gerekir, daha sonra ana depodaki yeni taahhüdüne bakın ve ardından ana deponun değişen referansını taahhüt edin / itin. Bu şekilde, tüm yapı için her iki depoya da erişiminiz olması gerekir.

Git subtree ile geçmişiniz de dahil olmak üzere başka bir havuzu kendinize entegre edersiniz. Bu yüzden, onu entegre ettikten sonra, deponuzun boyutu muhtemelen daha büyüktür (bu nedenle depoları daha küçük tutmak için bir strateji değildir). Entegrasyondan sonra diğer depoya bağlantı yoktur ve güncelleme almak istemiyorsanız bu depoya erişmeniz gerekmez. Yani bu strateji daha çok kod ve tarihin yeniden kullanımı için - ben şahsen kullanmıyorum.


Ama git subtreehala seninle de - eğer istersen - itebilirsin değil mi?
Ixx

@lxx Depo URL'sini biliyorsanız…
Franklin Yu

@FranklinYu Neden bilmiyordu? bu bilgileri yerel git meta verilerinden alamıyor musunuz?
adi518

@ adi518 Evet, alt ağacı oluşturan sizseniz. Ancak, deponuzu GitHub'a ittiyseniz ve diğerleri onu klonladıysa, alt ağaç URL'sini otomatik olarak bildiğini sanmıyorum.
Franklin Yu

@NiklasP - "ana depodaki yeni taahhüdü referansla" konusunu açıklayabilir misiniz? Nasıl çalıştırılacağı konusunda net olmadığım tek adım budur ve bu nedenle "değişen referans" da anladığım bir şey değildir.
Robert Oschler

21

alt modülü
bir uzaktan kumandaya bir ana repo itme alt modülün dosyaları itmek değil

Ağaç altı
uzaktan iter alt ağacın dosyalarına bir ana repo itme


3
"bir ana repo'yu uzaklara itmek, alt ağacın dosyalarını iter" Hayır.
J Bramble

@JBramble Muhtemelen SourceTree uygulaması ile yapıldığını belirtmeliyim örneğin:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
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.