Bir alt modülü en son işleme güncelleyin


269

Bir kütüphane olan A projem var ve bu B projesinde kullanılıyor.

Her iki A ve B projesi github üzerinde ayrı bir depoya sahiptir, ancak B içindeki A alt modülüne sahibiz.

Kütüphanede bazı sınıfları düzenledim, ki bu repo A'da, uzak repoyu ittim, böylece kütüphane (repo A) güncellenir.

Bu güncellemeler, alt modülün bir önceki taahhüdüne atıfta bulunan "referans" (alt modül) üzerine yansıtmaz .... git üzerinde alt modülü güncellemek için ne yapmalıyım?

Yanıtlar:


358

Alt modül dizinini girin:

cd projB/projA

Eğer A (tahmin ediyorlar gelen repo çekin değil proje B, senin ebeveynin git durumunu güncellemek):

git pull origin master

Kök dizine geri dönün ve güncellemeyi kontrol edin:

cd ..
git status

Alt modül daha önce güncellenmişse, aşağıdaki gibi bir şey gösterecektir:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Ardından, güncellemeyi uygulayın:

git add projB/projA
git commit -m "projA submodule updated"

GÜNCELLEME

@Paul'un belirttiği gibi, git 1.8'den beri,

git submodule update --remote --merge

alt modülü en son uzaktan işleme güncellemek için. Çoğu durumda uygun olacaktır.


35
BTW, alt git submodule updatemodülün sahibi değilseniz, sadece birisi projA'yı güncellediğinde yapabilirsiniz (yeni bir taahhüt kimliği alacaksınız).
Kjuly

Ben alt modül ana repo kendi (proj A) ama ben B projesinde bir komünistim
yağ

@Kjuly Taahhütten sonra, nasıl uzaktan kumandaya itilir? Sadece git pushmi?
KR29

1
@ KR29 sağ ve tam cmd git push <remote> <branch>, örn git push origin dev.
Kjuly

2
git submodule updateyalnızca referansları söz konusu alt modül (ler) e güncelleyen bir taahhüt (B projesinde) bayraksız çalışır (A projesinde). B HEADprojesini, A projesinin uzaktan izleme dalını referans alacak şekilde güncellemek için,git submodule update --remote --merge aşağıdaki Paul Hatcher'in cevabında gösterildiği gibi .
Ben Burns

109

Git 1.8'den beri

git submodule update --remote --merge

Bu, alt modülü en son uzaktan işleme güncelleyecektir. Daha sonra üst depodaki gitlink'in güncellenmesi için değişikliği yapmanız gerekecektir.

git commit

Ve sonra değişiklikleri bu olmadan itin, alt modüle işaret eden SHA-1 kimliği güncellenmez ve bu nedenle değişiklik başkaları tarafından görülemez.


Her ne kadar git commitherkes yapsam da hala görmüyor. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N

1
Taahhüdünüzden sonra bir "git push" yaptınız mı, aklınızda bulundurun, sadece yerel deponuzu değiştirdiğinizi unutmayın, herkesin görmesi için uzaktan kumandaya itmeniz gerekir
Paul Hatcher

Bu cevapta eksik (ancak aşağıdaki diğer cevaplarda belirtilmiştir): güncellenmiş alt modüllerin git addtaahhütte bulunulmadan önce aşamalandırılması gerekir .
joshng

1
@joshng Alt modüller üzerinde çalıştıkları noktada bulunan herkesin bunu anlayacağını hissediyorum. Bu bana yardımcı olan tek yazı, çok teşekkürler.
Husk Rekoms

38

Bir alt modülü güncellerseniz ve buna bağlı kalırsanız, içerilen veya daha yüksek düzeydeki repoya gitmeniz ve değişikliği buraya eklemeniz gerekir.

git status

şöyle bir şey gösterecek:

modified:
   some/path/to/your/submodule

Alt modülün senkronize olmadığı gerçeği,

git submodule

çıktı şunu gösterecektir:

+afafaffa232452362634243523 some/path/to/your/submodule

Artı, alt modülünüzün en üst deponun işaret etmesini beklediği yeri işaret ettiğini gösterir.

bu değişikliği eklemeniz yeterlidir:

git add some/path/to/your/submodule

ve taahhüt edin:

git commit -m "referenced newer version of my submodule"

Değişikliklerinizi artırdığınızda, önce alt modüldeki değişikliği yukarı ittiğinizden ve ardından dış repodaki referans değişikliğini ittiğinizden emin olun. Bu şekilde, güncellenen kullanıcılar her zaman başarıyla çalışabilir

git submodule update

Alt modüller hakkında daha fazla bilgiyi http://progit.org/book/ch6-6.html adresinde bulabilirsiniz .


+Çalıştırdığınızda bir saat görmüyorsanız git submodule, alt modülleri başlattığınızdan ve içe aktardığınızdan emin olun. Bunun için komutlar vardır git submodule initve git submodule updatesırasıyla.
fureigh

19

Tek satırlı sürüm

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

2

Diğer cevaplardan birkaçı, IMO'nun biraz dağınık hale gelebileceği alt modül dizini içinde birleştirmeyi / işlemeyi önerir.

Uzak sunucunun adlandırıldığını originve masteralt modülün dalını istediğimizi varsayarsak, kullanma eğilimindeyim:

git submodule foreach "git fetch && git reset --hard origin/master"

Not: Bu, her alt modülün bir donanım sıfırlaması gerçekleştirecektir - Bunu istemiyorsanız, değiştirebileceğiniz --hardiçin --soft.


1

Projem alt modül için 'en son' kullanmalıdır. Mac OSX 10.11, git sürüm 2.7.1'de, taahhütlerini toplamak için alt modül klasörüne 'gitmem' gerekmiyordu. Sadece düzenli yaptım

git pull --rebase 

ve alt modülümü doğru şekilde güncelledi.


0

Andy'nin yanıtı $ yolundan kaçarak benim için çalıştı:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

Neden Muhtemel nedeni @Andy Webov en onlar mesela yolunun, tek tırnak kullanılır çünkü cevabı kaçan gerektirmeyen oldu. '$path'
S0AndS0
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.