İçeren depoda depolanan kayıt işlemine bir Git Alt Modülü işaretçisi nasıl geri döndürülür?


128

Ana git depomda bir git alt modülüm var. Anladığım kadarıyla, ana depo bir SHA değerini (bir yerde ...) saklar ve "bağlantılı" olduğu alt modülün belirli bir taahhüdüne işaret eder.

Alt modülüme girdim ve yazdım git checkout some_other_branch. Hangi taahhütten geldiğime dair hiçbir fikrim yok.

Ana depo ve alt modülün tekrar senkronize olması için bu işaretçiyi geri döndürmek istiyorum.

İlk (muhtemelen saf) içgüdüm, git reset --hardbunun her şey için işe yaradığını söylemekti . Şaşırtıcı bir şekilde, bu senaryo için işe yaramadı.

Bu yüzden yazabileceğimi anladım git diff, alt modül işaretçisinin git checkout [SHA ID]eskiden sahip olduğu SHA kimliğini not edin ve sonra alt modüle girip ... ama kesinlikle daha kolay bir yolu olmalı?

Hala git alt modülleri hakkında bilgi sahibi olduğum için, bilmediğim kavramlar için kelimeler varsa lütfen terimimi düzeltmekten çekinmeyin.

Yanıtlar:


167

Alt modülünüzü, ana deponun olması gerektiğine inandığı ile senkronize olması için güncellemek istiyorsunuz. Güncelleme komutu bunun içindir:

Alt modül kılavuz sayfasından:

Kayıtlı alt modülleri güncelleyin, yani eksik alt modülleri klonlayın ve
içeren dizinde belirtilen commit'i kontrol edin
deposu. Bu, HEAD alt modüllerini,
--rebase veya --merge belirtilir veya anahtar alt modülü. $ name.update
yeniden oluşturmaya veya birleştirmeye ayarlanmış.

Bunu çalıştırın ve her şey yolunda olmalı:

git submodule update

4
Bir şekilde benim için eklemem gerekiyordu --init. Onsuz, alt modüller bir durumda kalacaktı (new commits). Alt modüllerim zaten başlatılmış olsa bile.
Ambidex

@Ambidex evet, --initseçenek tüm bunlarda çok önemlidir. Alt modüllerim https üzerinden klonlandığı için kullanıcı adı ve parola isteniyordu. Her iki klasöre gittim ve uzaktan kumandaları sshödeme için protokolü kullanacak şekilde ayarladım .
A-Dubb

1
alt modül kesinleştirme karması değiştirilmiş ve aşamalanmamışsa çalışmaz
tribbloid

--recursive ekleyebilir, böylece tüm alt modüllere gitmenize gerek kalmaz
Gaspa79

21

Bir alt modülün işaret ettiği kaydı değiştirmek için, alt modüldeki o sürümü teslim almanız, ardından içeren depoya geri dönmeniz, bu değişikliği eklemeniz ve işlemeniz gerekir.

Veya alt modülün en üst deponun işaret ettiği sürümde olmasını istiyorsanız, yapın git submodule update --recursive. --initYeni klonladıysanız ekleyin .

Ayrıca, git submodulebir alt modül komutu olmadan, size işaret ettiğiniz kaydı gösterecektir. Senkronize değilse, kaydetmenin önünde bir - veya bir + olacaktır.

İçinde bir alt modül bulunan bir ağaca bakarsanız, alt modülün, commitblob veya ağaç olan geri kalanının aksine işaretlendiğini görebilirsiniz .

belirli bir işlemenin alt modüllere neyi işaret ettiğini görmek için şunları yapabilirsiniz:

git ls-tree <some sha1, or branch, etc> Submodule/path

daha sonra commit veya başka herhangi bir şeyi günlüğe aktararak görebilirsiniz ( git-dirgit komut seviyesindeki seçenek alt modüle cd indirmeyi atlamanıza izin verir):

git --git-dir=Submodule/path log -1 $(<the above statement>)

Aşağıdaki komut bana yardımcı oldu (alt modüldeki ve modülümdeki değişiklikleri de göz ardı etmek istedim): git submodule update --init --recursive
Rajesh Goel

6

Az önce karşılaştığım başka bir durum, alt modülde atmak istediğiniz aşamalı olmayan bir değişiklik olup olmadığıdır. git submodule update bu değişikliği kaldırmaz ve ana dizinde git reset --hard da yapmaz. Alt modül dizinine gitmeniz ve git reset --hard yapmanız gerekir. Dolayısıyla, hem üst hem de alt modülümdeki aşamalanmamış değişiklikleri tamamen atmak istersem, aşağıdakileri yaparım:

Ebeveynde:

git reset --hard

git submodule update

Alt Modülde:

git reset --hard

5

Kullanım git ls-tree HEAD"superproject" klasöründe alt modülü de aslen işlemek ne olduğunu görmek için. Ardından alt modül dizinine git log --oneline --decorategeçin ve orijinal kaydetmenin hangi dalda olduğunu görmek için kullanın . Son olarak git checkout original-commit-branch.

Kurduğum bazı test dizinlerini kullanarak, komutlar şöyle görünebilir:

$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

"Süper proje" sm2 alt modülünü kaydetme sırasında gösterir, f68bed6ancak sm2 HEAD'de bulunur 5b8d48f. Alt modül kaydetme f68bed6, alt modül dizininde kullanıma alma için kullanılabilecek üç dal içerir.


TEŞEKKÜRLER DAN, PERFECTO!
Alec


1

Alt modüldeki ve modülümdeki değişiklikleri de göz ardı etmek istedim

Aşağıdaki komut bana yardımcı oldu:

git submodule update --init --recursive
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.