Yuvalanmış Git depoları?


182

Git depolarını iç içe yerleştirebilir miyim? Sahibim:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

O mantıklı mı lokal şeyin yönetimini kolaylaştırmak için ya da ben yönetmek zorunda yapmak ve ayrı ayrı 3. parti bir?git init/add/project_rootmy_project

Yanıtlar:


159

Alt modül adı verilen Git özelliğini arıyor olabilirsiniz . Bu özellik, ana havuzunuzun içine yerleştirilmiş bağımlı depoları yönetmenize yardımcı olur.


43
Göreceli bir git acemi olarak, bu blog / öğretici anlamak için daha kolay buldum chrisjean.com/2009/04/20/… Bir yardımcı kabuk komut dosyası bağlamı yerine sadece git odaklanarak daha basit bir yaklaşım gerektirir; Okumayı daha kolay buldum.
John K

4
Chrisjean.com blogu sadece onu takip etmeye çalışarak güncel değil gibi görünüyor. Greg'in wiki yazısı biraz daha karmaşık olabilir, ama git acemi olarak basit doğruyu tercih ederim ...
adaçayı

Blog şimdi iyi çalışıyor gibi görünüyor ve ne yazık ki adaçayı için, yorumdaki 34 (şimdi 35) yukarı oy, blog makalesinde bir değer olduğunu kabul ediyor gibi görünüyor. Anlaşılırlık ve operasyona özel tavsiyeler için doğruluktan ödün vermek zorunda olmadığınız anlaşılıyor. Okuduktan sonra, yazarın sadece kernel.org wiki sayfasını değil, biraz araştırdığını ve muhtemelen gerçek Git belgelerini okuduğunu hayal ediyorum . Blog yazarının tamamen bağlamsallaştırılmış bir örnekte Git'e yönelik açıklaması çok sayıda birey için oldukça yararlı görünüyor ...
Matthew Weber

13
Yukarıda bahsedilen chrisjean bağlantısının öldüğü BTW. Güncellenmiş bağlantı chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh

35

Üçüncü taraf kitaplıklarınızı ayrı bir depoya yerleştirin ve bunları ana proje ile ilişkilendirmek için alt modülleri kullanın. İşte bir gözden geçirme:

http://git-scm.com/book/en/Git-Tools-Submodules

Bir repoyu nasıl segmentlere ayıracağımıza karar verirken genellikle bunları ne sıklıkla değiştireceğime bağlı olarak karar verirdim. Bir üçüncü taraf kitaplığıysa ve yalnızca yaptığınız değişiklikler daha yeni bir sürüme yükseltiliyorsa, kesinlikle ana projeden ayırmalısınız.


22

Sadece bütünlük için:

Başka bir çözüm var, ben tavsiye ederim: alt ağaç birleştirme .

Alt modüllerin aksine, bakımı daha kolaydır. Her havuzu normal şekilde yaratabilirsiniz. Ana deponuzdayken, başka bir deponun ana kopyasını (veya başka bir dalı) ana dizininizin bir dizininde birleştirmek istersiniz.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Ardından, diğer havuzu dizininize çekmek için (güncellemek için) alt ağaç birleştirme stratejisini kullanın:

$ git pull -s subtree OtherRepository master

Bu yöntemi yıllardır kullanıyorum, işe yarıyor :-)

Alt modüllerle karşılaştırmayı da içeren bu yol hakkında daha fazla bilgiyi bu git howto doc'de bulabilirsiniz .


Git kitabına alt ağaç birleştirme başvurusu artık çalışmıyor. Şu anda, bu bağlantı gibi görünüyor: git-scm.com/book/en/v2/…
ericx

18

Ekleyebilirsiniz

/project_root/third_party_git_repository_used_by_my_project

için

/project_root/.gitignore

iç içe reponun üst repoya dahil edilmesini engellemelidir ve onlarla bağımsız olarak çalışabilirsiniz.

Ancak: Bir kullanıcı üst repoda git clean -dfx komutunu çalıştırırsa, yok sayılan iç içe repoyu kaldırır. Başka bir yol, klasörü sembolik olarak bağlamak ve sembolik bağlantıyı yok saymaktır. Daha sonra git clean komutunu çalıştırırsanız, sembolik bağlantı kaldırılır, ancak 'iç içe' repo gerçekten başka bir yerde olduğu için sağlam kalır.



5

Özet.

Git depolarını iç içe geçirebilir miyim?

Evet. Ancak git, varsayılan .gitolarak iç içe geçmiş deponun klasörünü izlemez . Git, iç içe geçmiş depoları yönetmek için tasarlanmış özelliklere sahiptir (okumaya devam edin).

Her şeyin yerel olarak yönetimini kolaylaştırmak için git init / / project_root'u eklemek mantıklı mı yoksa my_project ve 3. taraf olanı ayrı olarak mı yönetmem gerekiyor?

Git iç içe geçmiş depoları yönetmek için özelliklere sahip olduğundan, muhtemelen mantıklı değildir. Git'in yerleşik özelliklerini yönetmek için yerleşik özellikleri vardır submoduleve subtree.

İşte konu hakkında bir blog ve işte her birini kullanmanın artılarını ve eksilerini kapsayan bir SO sorusu .


2

Her proje için bir depo kullanırdım. Bu şekilde, geçmişe göz atmak daha kolay hale gelir.

Ayrıca kullandığım üçüncü taraf kütüphanesinin sürümünü kullanarak projenin deposuna da kontrol ederim.

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.