Git alt modül güncellemesi


242

Aşağıdakilerin ne anlama geldiği konusunda net değilim ( Git alt modül güncelleme belgelerinden):

sürece ... Alt modüller BAŞ sökülebilir yapacak --rebaseya --mergebelirtildi ...

Bir şeyleri nasıl değiştirir --rebase/ --mergedeğiştirir?

Ana kullanım durumum, alt modüller aracılığıyla diğer depolara yerleştireceğim bir grup merkezi depoya sahip olmak. Bu merkezi depoları, doğrudan orijinal konumlarında veya gömme depolarından (bunları alt modül aracılığıyla kullananları) geliştirebilmek istiyorum.

  • Bu alt modüllerden, dallar / modifikasyonlar oluşturabilir ve normal depolarda olduğu gibi push / pull kullanabilir miyim, yoksa temkinli olacak şeyler var mı?
  • Command (gönderme) etiketli (orijinal havuzun başkanı zaten 2.0'da olsa bile) say (etiketli) 1.0'dan 1.1'e kadar olan alt modülü nasıl ilerletebilirim veya hangi dalın taahhüdünün kullanıldığını nasıl seçebilirim?

"Ayrı kafa" konusunda, pratik bir örnek için ( bkz. Alt modülle ilgili değil, yine de alt modülle ilgili değil) stackoverflow.com/questions/964876/head-and-orighead-in-git ve stackoverflow.com/questions/237408/… )
VonC

"alt modülün içeriğini ana proje içinden değiştiremezsiniz": evet, doğru. Ve cevabımı, görünürdeki çelişkiye ışık tutacak şekilde düzenledim (değiştirilemez alt modül, yine de ana proje deposundan değiştirebileceksiniz!)
VonC

Yanıtlar:


304

Bu GitPro sayfası , git alt modül güncellemesinin sonuçlarını güzelce özetliyor

Çalıştırdığınızda git submodule update, projenin belirli bir sürümünü denetler, ancak bir şube içinde kontrol etmez. Buna bağımsız bir kafa olması denir - HEAD dosyası sembolik bir referansı değil, doğrudan bir taahhüdü işaret eder.
Mesele şu ki, genellikle bağımsız bir kafa ortamında çalışmak istemezsiniz, çünkü değişiklikleri kaybetmek kolaydır .
Bir başlangıç ​​alt modül güncellemesi yaparsanız, çalışacak bir dal oluşturmadan bu alt modül dizininde işlem yapın ve sonra git alt modül güncellemesini bu arada taahhüt etmeden süper projeden tekrar çalıştırın, Git size bildirmeden değişikliklerinizin üzerine yazacaktır. Teknik olarak işi kaybetmeyeceksiniz, ancak ona işaret eden bir dalınız olmayacak, bu yüzden geri almak biraz zor olacak.


Not Mart 2013:

" Git submodule tracking latest " de belirtildiği gibi, şimdi bir alt modül (git1.8.2) bir dalı izleyebilir.

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 
# or (with rebase)
git submodule update --rebase --remote

Bkz. " git submodule update --remoteVsgit pull ".

MindTooth 'ın cevabı (yerel yapılandırma olmadan) manuel güncelleme göstermektedir:

git submodule -q foreach git pull -q origin master

Her iki durumda da, alt modül referanslarını ( gitlink , üst repo dizinindeki özel bir giriş) değiştirecek ve ana repodan bahsedilen referansları eklemeniz, taahhüt etmeniz ve aktarmanız gerekecektir.
Bir sonraki ana kopyayı kopyalayacağınız zaman, bu yeni SHA1 referanslarını yansıtacak şekilde alt modülleri dolduracaktır.

Bu cevabın geri kalanı klasik alt modül özelliğini detaylandırıyor (bir alt modül kavramının arkasındaki tüm nokta olan sabit bir işleme referans ).


Bu sorunu önlemek için, git checkout -b çalışma veya eşdeğeri bir alt modül dizininde çalışırken bir şube oluşturun. Alt modül güncellemesini ikinci kez yaptığınızda, yine de çalışmanızı geri döndürür, ancak en azından geri dönmek için bir işaretçiniz vardır.

İçlerinde alt modüller ile dalların değiştirilmesi de zor olabilir. Yeni bir dal oluşturursanız, oraya bir alt modül ekleyin ve ardından bu alt modül olmayan bir şubeye geri dönerseniz, yine de izlenmemiş dizin olarak alt modül dizininiz olur:


Yani, sorularınızı cevaplamak için:

dallar / modifikasyonlar oluşturabilir ve normal depolarda yaptığım gibi push / pull kullanabilir miyim, yoksa temkinli şeyler var mı?

Şube oluşturabilir ve değişiklikler yapabilirsiniz.

UYARI ( Git Alt Modül Öğreticisinden ): Değişikliği referans alan süper projeye yayınlamadan (itmeden) her zaman alt modül değişikliğini yayınlayın (itin). Alt modül değişikliğini yayınlamayı unutursanız, diğerleri depoyu klonlayamaz.

taahhüt edilen başvurulan alt modülün say (etiketli) 1.0'dan 1.1'e nasıl ilerlettiğini (orijinal repo başkanı zaten 2.0'da olsa bile)

" Alt Modülleri Anlama " sayfası yardımcı olabilir

Git alt modülleri iki hareketli parça kullanılarak uygulanır:

  • .gitmodulesdosya ve
  • özel bir ağaç nesnesi.

Bunlar birlikte, projenizdeki belirli bir yere teslim alınan belirli bir havuzun belirli bir revizyonunu üçgenler.


Gönderen git submodule sayfa

alt modülün içeriğini ana projeden değiştiremezsiniz

% 100 doğru: bir alt modülü değiştiremezsiniz, yalnızca taahhütlerinden birine bakın.

Bu nedenle, ana projenin içinden bir alt modülü değiştirdiğinizde:

  • alt modül içinde (yukarı akım modülüne) taahhüt ve itme ihtiyacı ve
  • daha sonra ana projenize gidin ve yeniden taahhüt verin (ana projenin yeni oluşturduğunuz ve ittiğiniz yeni alt modül taahhüdüne başvurması için)

Bir alt modül , ana projenin yalnızca diğer bileşenlerin belirli taahhütlerini (burada "alt modüller olarak bildirilen diğer Git depolarını" ifade ettiği) bileşen tabanlı bir yaklaşım geliştirmenize olanak tanır .

Bir alt modül, ana proje geliştirme döngüsüne bağlı olmayan başka bir Git deposuna bir işaretleyicidir (taahhüt): it ("diğer" Git repo) bağımsız olarak gelişebilir.
İhtiyacı ne olursa olsun diğer repodan seçmek ana projeye kalmıştır.

Bununla birlikte, kolaylık olması durumunda , bu alt modüllerden birini doğrudan ana projenizden değiştirmek isterseniz, önce bu alt modül değişikliklerini orijinal Git deposunda yayınlamanız ve ardından ana projenizi bir yeni adı geçen altmodülün sürümü.

Ancak ana fikir kalır: belirli bileşenlere atıfta bulunarak:

  • kendi yaşam döngüsüne sahip olmak
  • kendi etiketlerine sahip olmak
  • kendi gelişimleri var

Ana projenizde bahsettiğiniz belirli taahhütlerin listesi yapılandırmanızı tanımlar ( yalnızca Sürüm Kontrol Sistemi'ni içeren Yapılandırma Yönetimi bununla ilgilidir )

Bir bileşen gerçekten ana projenizle aynı anda geliştirilebilseydi (çünkü ana projedeki herhangi bir değişiklik alt dizinin değiştirilmesini gerektirecektir ve tersi), o zaman artık bir "alt modül" olurdu, ama bir alt ağaç birleştirmesi (ayrıca eski kod tabanını cvs'den dağıtılmış depoya aktarma sorusunda da sunulmuştur ), iki Git deposunun geçmişini birbirine bağlar.

Bu, Git Alt Modüllerinin gerçek doğasını anlamaya yardımcı olur mu?


77
Vay. Bu kadar basit bir şey için bu kadar uzun bir açıklama, basit olan herhangi bir yeni geleni sadece svn: externals ile yapışmaya korkutmak için yeterli olmalıdır. ;-)
conny

2
@conny: ama, " Git submodülleri neden svn dışsallarıyla uyumsuz? " bölümünde ayrıntılı olarak açıkladığım gibi , alt modüller temel olarak farklı ve uyumlu değil svn:externals.
VonC

1
Üzgünüm, kendi sorumu cevaplamak için, alt modül içine cd'ing toplamak ve bir sha git git, ya da git çekme / getirme iyi olacak. Ardından güncellemeyi yerel depoda gerçekleştirir.
Henrik

2
@hced: Tüm alt modülleri bir kerede kullanarak da vurabilirsinizgit submodule foreach
Dav Clark

1
.. hala anlamıyorum. Web'de bir yerde daha kolay bir açıklama var mı?
eugene

135

Her alt modülü güncellemek için aşağıdaki komutu çağırabilirsiniz (havuzun kökünde):

git submodule -q foreach git pull -q origin master

Tüm işlemi takip etmek için -q seçeneğini kaldırabilirsiniz .


15
Sadece git submodule update --init --recursivekökten kaçarsanız, hepsini özyinelemeli olarak alır ve henüz yoksa başlatır.
Sam Soffes

10
@SamSoffes Bu tamamen farklı bir amaca hizmet ediyor. Alt modüllerin güncellenmesi, alt modülleri şu anda işaret ettikleri taahhütte kontrol edecektir (mutlaka en son taahhüt değil). Yukarıdaki cevabın çözümü, her alt modülün taahhüdünü orijin / master'dan en son HEAD'e günceller.
indragie

7
Yeni yöntemim:git submodule update --rebase --remote
MindTooth

19

--rebaseVs. --mergeseçeneğini ele almak için :

Diyelim ki süper deponuz A ve alt modül B var ve alt modül B'de biraz iş yapmak istiyorsunuz. Ödevinizi yaptınız ve bunu çağırarak biliyorsunuz

git submodule update

HEAD'sız bir durumdasınız, bu nedenle bu noktada yaptığınız herhangi bir taahhüde geri dönmek zor. Böylece, B alt modülünde yeni bir dal üzerinde çalışmaya başladınız

cd B
git checkout -b bestIdeaForBEver
<do work>

Bu arada, A projesindeki başka biri, B'nin en son ve en büyük versiyonunun gerçekten A'nın hak ettiği şey olduğuna karar verdi. Alışkanlık dışında, en son değişiklikleri birleştirirsiniz ve alt modüllerinizi güncellersiniz.

<in A>
git merge develop
git submodule update

Ah hayır! Yine başsız bir duruma geri döndünüz, muhtemelen B şimdi B'nin yeni ipucu veya başka bir taahhütle ilişkili SHA'yı işaret ediyor. Keşke sahip olsaydın:

git merge develop
git submodule update --rebase

Fast-forwarded bestIdeaForBEver to b798edfdsf1191f8b140ea325685c4da19a9d437.
Submodule path 'B': rebased into 'b798ecsdf71191f8b140ea325685c4da19a9d437'

Şimdi, B için şimdiye kadarki en iyi fikir yeni taahhüdün üzerine oturtuldu ve daha da önemlisi, hala başsız bir durumda değil, B için geliştirme dalındasınız!

( --mergeDeğişiklikleriniz afterUpdateSHA'ya yeniden basmanın aksine, çalışma dalına beforeUpdateSHA ile afterUpdateSHA arasındaki değişiklikleri birleştirir.)


7

Git 1.8.2 --remote, tam olarak bu davranışı etkinleştirecek yeni bir seçeneğe sahiptir . Koşu

git submodule update --rebase --remote

her alt modülün akış yukarı yönündeki en son değişiklikleri alır, yeniden adlandırır ve alt modülün en son revizyonunu kontrol eder. Gibi belgeler koyar o:

--Remote

Bu seçenek yalnızca güncelleme komutu için geçerlidir. Alt modülü güncellemek için süper projenin kayıtlı SHA-1'ini kullanmak yerine, alt modülün uzaktan izleme kolunun durumunu kullanın.

Bu, git pullher alt modülde çalışmaya eşdeğerdir , bu genellikle tam olarak istediğiniz şeydir.

(Bu, bu yanıttan kopyalanmıştır .)


İyi kurulmuş ve doğru cevapları olan daha eski bir soruyu cevaplamaya karar verirseniz, günün geç saatlerinde yeni bir yanıt eklemek size herhangi bir kredi getirmeyebilir. Bazı farklı yeni bilgileriniz varsa veya diğer cevapların yanlış olduğuna ikna olduysanız, elbette yeni bir cevap ekleyin, ancak aynı temel bilgiyi genellikle sorulduktan uzun bir süre sonra veren 'yine başka bir cevap' kazandı Sana çok fazla kredi kazandırmaz. Bunun ne olduğuna dair bir açıklama yok - harici belgelere bir bağlantı bile yok (bu yeterli olmaz).
Jonathan Leffler

2
Gibi, değil "henüz başka cevap" HAYIR diğer cevabı bu komutu vardır (yanıldığımı ispat). Diğer cevaplar benim için işe yaramadı, bu yorum işe yaradı, bu yüzden orijinal sahibine kredi verirken bir cevap olarak göndermeye karar verdim. Bu yüzden downvote'unuzu kaldırmayı düşünün.
Iulian Onofrei

Bir var comment tarafından MindTooth bu onların şimdi ne olduğunu söyleyerek 2015. Bunun ne yaptığına dair hiçbir açıklama yapmazsınız (MindTooth'dan bahsetmiş olmanıza rağmen, ancak - bu yorumda olduğu gibi URL'leri gömmek yardımcı olacaktır) ne demek istediğinizle ilgili gerçek bir açıklama yoktur). Neden iyi bir fikir olduğunu söylemiyorsun. Herhangi bir uyarı vermezsiniz. Bence bu yararlı bir cevap değil çünkü çözdüğünden daha fazla soru getiriyor.
Jonathan Leffler

1
Bununla demek istediğim, çalışmak yerine çalışmak anlamına geliyordu . İnanın bana, eğer daha fazla insan bu cevabı görseydi çok sevinirdi, çünkü işe yarıyor . Bu gibi şeyler için, çoğu insan nasıl uygulandığını değil, bir git alt modülünü güncelleyen komutu bilmek ister.
Iulian Onofrei

Cevabınızı yanlış olduğunu kanıtlamak için de düzenledim, stackoverflow.com/questions/1979167/git-submodule-update/… !!!
Iulian Onofrei
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.