Git alt modülünü başka bir depo ile nasıl değiştirebilirim?


98

Git alt modülünü farklı bir git deposu ile nasıl değiştirebilirim?

Özellikle, bir alt modülüm var:

  • bulunan ./ExternalFrameworks/TestFrameworkbir git Repo bu noktagit@github.com:userA/TestFramework.git
  • Şimdi işaret etmesini istiyorum git@github.com:userB/TestFramework.git.

Sorun şu ki, alt modülü burada açıklanan yöntemle sildiğimde , ardından komutu kullanarak yeniden eklemem

git submodule add git@github.com:userB/TestFramework.git

Bu hatayı alıyorum:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Yanıtlar:


128

Alt modülün konumu (URL'si) değiştiyse, basitçe şunları yapabilirsiniz:

  1. .gitmoduleYeni URL'yi kullanmak için dosyanızı değiştirin
  2. Depodaki alt modül klasörünü silin rm -rf .git/modules/<submodule>
  3. Çalışma dizinindeki alt modül klasörünü silin rm -rf <submodule>
  4. Çalıştırmak git submodule sync
  5. Çalıştırmak git submodule update

Daha eksiksiz bilgi başka bir yerde bulunabilir:


4
Ayrıca kayda değer: başka bir kullanıcı (alt modülü zaten başlatmış olan) güncellemenizi aldığında, yeni alt modülün kendileri için çalışmasından önce bir kez "git alt modül senkronizasyonu" yapmaları gerekecektir.
joseph.hainline

2
Bu benim için işe yaramadı. Alt modülüm bundan sonra hala eski URL'yi gösteriyor. Herhangi bir fikriniz neden?
Arne

34
@Arne Belki alt modülünüz hiçbir zaman düzgün şekilde başlatılmadı. Benim rm -rf .git/modules/<submodule>için işe yaramadan önce yapmak zorundaydım.
David Braun

Yapıyor olsa @DavidBraun ben @Arne aynı sorun var git submodule syncsonra rm -rf .git/modules/<submodule>verir fatal: Not a git repository: ../.git/modules/<submodule>. Herhangi bir ipucu? Başlangıçta alt modülü git submodule add https://<submodule-url>git docs ...
acannon828

1
Daha sonra modülün dizinine cd, gitmek istediğim şubeyi kontrol et, sonra git pull.
Nicolas Raoul

34

Öncelikle, mevcut alt modülü, daha önce burada bahsedilen , kolaylık sağlamak için dahil ettiğim yöntemle silin :

  • .gitmodulesDosyadan ilgili bölümü silin
  • İlgili bölümü şuradan silin: .git/config
  • Çalıştır git rm --cached path_to_submodule(sondaki eğik çizgi yok)
  • Şimdi izlenmeyen alt modül dosyalarını tamamlayın ve silin

Şimdi, yeni alt modülü işaretli olarak ekleyin --name. Bu, .git/configgit'e, daha önceki geçmişinizde hala çalışmak istediğiniz, tarihsel olarak orada bulunan alt modülle çatışmayı çözmek için alt modül için referans olarak alternatif bir isim verecektir .

Yani yazın:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

ve alt modülü beklediğiniz yola yükleyeceksiniz.


2
Bu yol işe yarasa da, Tim'in yöntemi kadar temiz değil.
joseph.hainline

4
Bu benim için çalıştı ama ben de silmek zorunda kaldım .git/modules/<path_to_submodule>.
Nate

1
Referans için minnettarım --name. Bunu çevreleyen sorunların farkında değildim ve bu seçeneği kullanana kadar bir alt modülü değiştiremedim (cevabınız sayesinde).
aknuds1

Bu benim için işe yarayan tek yöntem oldu, ancak aynı dizin adını korumak istedim. Doğru yolu kontrol etti ve modül adını istenen ad yaptı ancak çalışma dizini adı yeni depo adıydı. Öyleyse, aynı adı istiyorsanız, url'nin sonunda şunu da belirtmeniz gerekir: git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

9

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 Dev
git submodule sync
git submodule update --init --recursive --remote

5

Bunu benim için düzelten şey, git deponuzun (alt modülün değil) kökünde idi, çalıştırın

rm -rf .git/modules/yourmodule

O zaman normal şekilde ekleyebilmelisiniz.


3

Bulduğum en kolay yol şuydu:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

Benim .gitmodulesmanuel olarak değişiklik yapma fikrinden hoşlanmadım . Bununla ilgili küçük bir blog yazısı da yazdım .


2

Yalnızca bu klon için uzak URL'yi değiştirmek istiyorsanız :

git config submodule."$submodule_name".url "$new_url"

Bu .gitmodules, üst projedeki dosyayı etkilemeyeceğinden diğer geliştiricilere yayılmayacaktır.

Bu, burada "kullanıcıya özel kayıt değişiklikleri" olarak tanımlanmaktadır .

Yenidengit submodule sync varsayılan URL'ye sıfırlanacağı içinçalıştırmayın.

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.