Git alt modülü için uzak depo nasıl değiştirilir?


726

İçinde bir alt modül bulunan bir git deposu oluşturdum. Alt modülün kendisine uzak havuz yolunu değiştirmesini söyleyebilirim, ancak üst veri havuzuna alt modülün uzak havuz yolunu nasıl değiştireceğini nasıl söyleyeceğimi bilmiyorum.

Eğer biraz şanssızım ve el ile bir şeyler yapmak zorunda kalırsam şaşırmazdım, çünkü alt modülleri silmek bile kolay değildir.


8
Not: Git 2.25 (Q1 2020) yeni bir komutla geliyor ":git submodule set-url [--] <path> <newurl>
VonC

Yanıtlar:


1010

.gitmodulesURL'yi güncellemek için dosyayı düzenleyebilmeniz ve daha sonra git submodule syncbu değişikliği üst projede ve çalışan kopyanızda yansıtacak şekilde çalıştırabilmeniz gerekir.


22
Bu, en azından 1.7.1 veya 1.7.3 sürümünde .git / config dosyasını güncellemiyor gibi görünüyor.
davidtbernal

6
bu önceki taahhütler için alt modül url yapılandırmasını da günceller mi? eski bir taahhüt ödeme eğer eski, yeni alt modül urls işaret edecek mi?
maxmelbin

64
git submodule foreach -q git config remote.origin.url"Gerçek" alt modül url'lerini görmek için kullanın
Joel Purra

10
.git/configGit 2.1.0 kullanarak güncellenmedi . Ben güncellemeye de vardı .gitmodulesve .git/configelle çalıştırmadan önce git submodule sync --recursivebenim alt modülü uzaktan güncellenebilir olması.
desseim

7
git submodule update --init --recursive --remoteDepoyu yeni uzaktan kumandayla değiştiren anahtar adım eksik görünüyor
Jason Axelson

155

Bu komutlar, yerel depodaki herhangi bir dosyayı değiştirmeden komut isteminde çalışacaktır

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Development
git submodule sync
git submodule update --init --recursive --remote

Ekran görüntüleri için lütfen bloga bakın: GIT alt modüllerinin URL'sini / Şubesini aynı deponun diğer URL'sine / şubesine değiştirme


8
Bu işe yaradı ama değişiklikleri uzaktan kumandaya itmeyi hatırlamak zorundaydım. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00

5
Bu benim için korkunç bir karmaşa yarattı. Komutlar sessizce azaldı, ancak gerçek alt modül deposu hala uzaktan kumandasının eski (eski URL) olduğunu düşünüyor. Belki bu komutlara alt modülün deposundaki diğer komutlar eşlik etmelidir?
Motti Shneor

5
Son komut biraz aşırı ... İçinde alt modüllere sahip alt modülleriniz varsa, bu alt alt modülleri de uzaktan güncelleyecektir, bu da ihtiyacınız olan şey değildir.
Baptiste Wicht

7
Submod'u alt modülünüzün adıyla değiştirmeniz gerektiğini unutmayın!
Shital Shah

133

Basit bir ifadeyle, sadece .gitmodules dosyasını düzenlemeniz, ardından yeniden senkronize etmeniz ve güncellemeniz gerekir:

Dosyayı git komutuyla veya doğrudan düzenleyin:

git config --file=.gitmodules -e

ya da sadece:

vim .gitmodules

ardından yeniden senkronize edin ve güncelleyin:

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --initbenim için çalıştı --remote, uzak repo HEAD bağlanmış gibi görünüyor.
Chaim Eliyah

98

Git 2.25 (Q1 2020) ile değiştirebilirsiniz .
" Git alt modül URL'si değişti " ve yeni komut

git submodule set-url [--] <path> <newurl>

Orijinal cevap (Mayıs 2009, on yıl önce)

Aslında, rolün açıklığa kavuşturulması için Nisan 2009'da bir yama sunulmuşturgitmodule .

Şimdi gitmodule belgeleri henüz içermiyor:

.gitmodulesGit-yapılandırma: bir git çalışan ağacın en üst düzey dizinde yer alan dosya, gereksinimleri -of linkgit uyan bir söz dizimi ile bir metin dosyası 1 .
[YENİ]:
Bu dosya Git tarafından yönetildiği için, bir projenin alt modüllerinin + kayıtlarını izler.
Bu dosyada saklanan bilgiler, proje yapılandırma dosyasında saklanan kaydın yetkili sürümünün hazırlanması için bir ipucu olarak kullanılır.
Konfigürasyon dosyasına kullanıcıya özel kayıt değişiklikleri (örn. Alt modül URL'lerindeki farklılıkları hesaba katmak için) yapılandırma dosyasına, dosyaya kaydedilecek kayıt değişiklikleri (örn. Alt modül kaynağının yer değiştirmesi nedeniyle +) yapılmalıdır. .

Bu Jim'in cevabını hemen hemen doğrular .


Bu git alt modül eğitimini izlerseniz git submodule init, alt modül veri havuzu URL'lerini .git / config dosyasına eklemek için " " gerektiğini görürsünüz .

URL değiştiğinde (özellikle alt modüllerin sayısı önemliyse) bu görevi kolaylaştırmak için Ağustos 2008'de " git submodule sync" eklendi .
Bu komutla ilişkilendirilmiş komut dosyası yeterince basittir:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

Hedef kalıyor: git config remote."$remote".url "$url"


Alt modülün URL'sini yalnızca bu makinede değiştirmek istedim. Ben rekoru değiştirebilir ebeveyn projesinden .git/config: yaparak git config submodule."$submodule_name".url "$new_url" edilir de burada tarif .
joeytwiddle

İsteğe bağlı çift tire ne git submodule set-url [--] <path> <newurl>işe yarar ?
jeverling

1
@jeverling Seçenekleri parametrelerden ayırmaya yardımcı olurlar: bkz. stackoverflow.com/a/1192194/6309
VonC

1
Daha eski bir sürümüne sahip Ubuntu kullanıcıları için güncellemek için bu
PPA'yı

69

Benim için ne işe yaradı (Windows'ta, git 1.8.3.msysgit.0 sürümünü kullanarak):

  • .Gitmodules dosyasını yeni havuz yolu ile güncelleyin
  • İlgili satırı ".git / config" dosyasından kaldırın
  • ".Git / modules / external" dizinindeki ilgili dizini silin
  • Teslim alınan alt modül dizininin kendisini silin (bunun gerekli olup olmadığından emin olun)
  • Koş git submodule initvegit submodule update
  • Teslim edilen alt modülün doğru taahhütte olduğundan emin olun ve hashın farklı olması muhtemel olduğundan taahhüt edin

Tüm bunları yaptıktan sonra, her şey beklediğim durumda. Deponun diğer kullanıcılarının, güncelleme yapmaya geldiklerinde benzer acıya sahip olacağını hayal ediyorum - bu mesajı taahhüt mesajınızda açıklamak akıllıca olacaktır!


2
Bunun için çok teşekkür ederim. Zaten koştuktan sonra benim için çalışan tek kişi bu git submodule update. Diğer cevapları takip etmek ./git/modules/externaldir ne değiştirmez, bu yüzden güncelleme girişimi hala yanlış url çekerek sonuçlanır.
NtscCobalt

bu biraz tehlikeli gibi görünüyor ve önceki alt modülün tarihini koruduğundan emin değilim. Örneğin, ana deponuzun (alt modül içeren bir) eski bir taahhüdünü veya şubesini kontrol etmek istiyorsanız, ESK'nin alt modülünü bağlı olan ve ana bölümün eski taahhüdüyle ilgili olarak çekeceğinden emin değilim. .
Motti Shneor

Hayır, neredeyse kesinlikle bilmeyecek - ilk adımdan sonra tüm adımları tekrar yapmanız gerekecek. Bu sadece alt modülün mevcut durumunu nükleer denemek için çalıştı buldum. Bunu yazdığımdan beri durumun değişip değişmediğini bilmiyorum, zihin :)
Ben Hymers

@MottiShneor, önceki alt modül geçmişini tutmanız gerekiyorsa gerçekten tehlikeli görünüyor, ancak emin değilim. Benim durumumda işe
yarayan

1
Bu adımları takip edin ve "Teslim edilen alt modül dizinin kendisini silin (bunun gerekli olup olmadığından emin olun)"
ifadesinin

10

Sadece .git / config dosyanızı düzenleyin . Örneğin; Eğer bir varsa "ortak" alt modülü süper-modülünde yapabilirsiniz:

git config submodule.common.url /data/my_local_common

Bu, URL'yi bir kerelik kullanım için değiştirmeye çalışıyorsanız, süper projede kalıcı olarak değil, yalnızca en iyi yoldur. Örneğin, disk üzerindeki yerel kopyalardan alt modülleri klonlamak istiyorsunuz.
Andy

4

git config --file=.gitmodules -e yolu güncelleyebileceğiniz varsayılan düzenleyiciyi açar

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.