Jak zmienić zdalne repozytorium dla submodułu git?

722

Utworzyłem repozytorium git z podmodułem. Jestem w stanie powiedzieć samemu podmodułowi, aby zmienił ścieżkę zdalnego repozytorium, ale nie jestem pewien, jak powiedzieć repozytorium nadrzędnemu, jak zmienić ścieżkę zdalnego repozytorium dla tego podmodułu.

Nie zdziwiłbym się, gdyby trochę nie miałem szczęścia i musiałem robić rzeczy ręcznie, ponieważ nawet usuwanie submodułów nie jest łatwe.

Andrew Grimm
źródło
8
Uwaga: Git 2.25 (Q1 2020) zawiera nowe polecenie „:git submodule set-url [--] <path> <newurl>
VonC

Odpowiedzi:

1010

Powinieneś po prostu móc edytować .gitmodulesplik, aby zaktualizować adres URL, a następnie uruchomić, git submodule syncaby odzwierciedlić tę zmianę w superprojekcie i kopii roboczej.

Jim Puls
źródło
22
To nie wydaje się aktualizować .git / config, przynajmniej w 1.7.1 lub 1.7.3.
davidtbernal
6
czy to aktualizuje również konfigurację adresu URL podmodułu dla poprzednich zatwierdzeń? np. jeśli kasę starszego zatwierdzenia, czy będzie to wskazywało na nowe adresy URL podmodułów?
maxmelbin
62
Użyj, git submodule foreach -q git config remote.origin.urlaby zobaczyć „rzeczywiste” adresy podmodułów
Joel Purra,
9
Nie zaktualizowało się .git/configdla mnie przy użyciu git 2.1.0. Musiałem zaktualizować oba .gitmodulesi .git/configręcznie przed uruchomieniem a, git submodule sync --recursiveaby mój zdalny podmoduł został zaktualizowany.
desseim
7
Wydaje się, że brakuje w tym kluczowego kroku, git submodule update --init --recursive --remotektóry faktycznie zmienia repozytorium na nowy pilot
Jason Axelson
154

Te polecenia wykonają pracę w wierszu polecenia bez zmiany żadnych plików w lokalnym repozytorium

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

Zobacz zrzuty ekranu na blogu: Zmiana adresu URL / gałęzi GIT na inny adres URL / gałąź tego samego repozytorium

Pavan Sokke Nagaraj
źródło
8
To zadziałało, ale musiałem pamiętać o wprowadzeniu zmian do pilota. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00,
5
To stworzyło dla mnie straszny bałagan. Komendy działały cicho, ale rzeczywiste repozytorium submodułów nadal uważa, że ​​jego zdalny jest stary (stary adres URL). Może tym poleceniom powinny towarzyszyć inne polecenia w repozytorium submodułu?
Motti Shneor
5
Ostatnie polecenie jest nieco ekstremalne ... Jeśli masz podmoduły z podmodułami, spowoduje to również zdalną aktualizację podmodułów, co jest mało prawdopodobne.
Baptiste Wicht
7
Pamiętaj, że musisz zastąpić Submod nazwą swojego podmodułu!
Shital Shah
133

Mówiąc najprościej, wystarczy edytować plik .gitmodules, a następnie ponownie zsynchronizować i zaktualizować:

Edytuj plik za pomocą polecenia git lub bezpośrednio:

git config --file=.gitmodules -e

Lub tylko:

vim .gitmodules

następnie ponownie zsynchronizuj i zaktualizuj:

git submodule sync
git submodule update --init --recursive --remote
Matthew Wilcoxson
źródło
6
git submodule update --initpracował dla mnie, --remotewydaje się wiązać go z HEAD zdalnego repo.
Chaim Eliyah
95

W Git 2.25 (Q1 2020) możesz go modyfikować .
Zobacz „ Zmieniony adres URL modułu podrzędnego Git ” i nowe polecenie

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

Oryginalna odpowiedź (maj 2009 r., Dziesięć lat temu)

W kwietniu 2009 r. Przesłano łatkę wyjaśniającą gitmodulerolę.

Więc teraz dokumentacja gitmodule nie obejmuje jeszcze:

.gitmodulesPlik znajdujący się w katalogu najwyższego poziomu drzewa roboczego git, to plik tekstowy o składni odpowiadają wymaganiom -W linkgit: git-config 1 .
[NOWOŚĆ]:
Ponieważ tym plikiem zarządza Git, śledzi on + rekordy submodułów projektu.
Informacje przechowywane w tym pliku służą jako wskazówka do przygotowania wiarygodnej wersji rekordu zapisanej w pliku konfiguracji projektu.
W pliku konfiguracyjnym należy wprowadzić zmiany rekordów specyficzne dla użytkownika (np. W celu uwzględnienia różnic w adresach URL podmodułów spowodowanych sytuacjami sieciowymi), natomiast w tym pliku należy wprowadzić zmiany rekordów do propagacji (np. + Z powodu przeniesienia źródła submodułu) .

To właściwie potwierdza odpowiedź Jima .


Jeśli wykonasz ten samouczek git submodule , zobaczysz, że potrzebujesz " git submodule init", aby dodać adresy URL repozytorium submodułu do .git / config.

W sierpniu 2008 r. dodanogit submodule sync” właśnie po to, aby ułatwić to zadanie, gdy zmienia się adres URL (szczególnie jeśli liczba podmodułów jest ważna). Powiązanie skryptu z tym poleceniem jest dość proste:

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

Celem pozostaje: git config remote."$remote".url "$url"

VonC
źródło
Chciałem zmienić adres URL submodułu tylko na tym komputerze. Z projektu nadrzędnego mogłem zmodyfikować rekord .git/config, wykonując: git config submodule."$submodule_name".url "$new_url" co również zostało opisane tutaj .
joeytwiddle
Co robi opcjonalne podwójne myślniki git submodule set-url [--] <path> <newurl>?
jeverling
1
@ jeverling Pomagają oddzielić opcje od parametrów: patrz stackoverflow.com/a/1192194/6309
VonC
1
Należy pamiętać, że dla użytkowników Ubuntu ze starszą wersją git można użyć tej PPA do aktualizacji: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs
69

Co zadziałało dla mnie (w systemie Windows przy użyciu gita w wersji 1.8.3.msysgit.0):

  • Zaktualizuj .gitmodules ścieżką do nowego repozytorium
  • Usuń odpowiedni wiersz z pliku „.git / config”
  • Usuń odpowiedni katalog z katalogu „.git / modules / external”
  • Usuń sam pobrany katalog submodułu (niepewny, czy jest to konieczne)
  • Uruchom git submodule initigit submodule update
  • Upewnij się, że podmoduł wyewidencjonowany ma poprawne zatwierdzenie i zatwierdź, ponieważ jest prawdopodobne, że skrót będzie inny

Po tym wszystkim wszystko jest w stanie, którego bym się spodziewał. Wyobrażam sobie, że inni użytkownicy repozytorium będą odczuwać podobny ból, kiedy przyjdą na aktualizację - mądrze byłoby wyjaśnić te kroki w wiadomości zatwierdzającej!

Ben Hymers
źródło
2
Dziękuję bardzo za to. To jedyny, który pracował dla mnie po tym, jak już uruchomiłem git submodule update. Podążanie za innymi odpowiedziami nie zmieniłoby tego, co było w katalogu, ./git/modules/externalwięc próba aktualizacji spowodowałaby, że nadal pobierałby nieprawidłowy adres URL.
NtscCobalt
wydaje się to nieco niebezpieczne i nie jestem pewien, czy zachowuje historię poprzedniego podmodułu. Jeśli na przykład chcesz sprawdzić stary zatwierdzenie lub gałąź głównego repozytorium (ten zawierający podmoduł), nie jestem pewien, czy będzie wiedział, jak wyciągnąć stary moduł podrzędny i powiązany z tym starym zatwierdzeniem głównego .
Motti Shneor
Nie, prawie na pewno nie będzie wiedział - będziesz musiał wykonać wszystkie kroki po pierwszym. Właśnie to, co znalazłem, zadziałało w celu wykasowania obecnego stanu submodułu. Nie wiem, czy stan rzeczy się zmienił, odkąd to napisałem, pamiętaj :)
Ben Hymers
@MottiShneor, co wydaje się niebezpieczne, jeśli chcesz zachować historię poprzedniego modułu, choć nie jestem tego pewien. W moim przypadku to jedyne rozwiązanie, które zadziałało, chciałem po prostu zastąpić oryginalny podmoduł własnym widelcem
arainone
1
Postępując zgodnie z tymi krokami, okazało się, że „Usuń sam katalog podmodułu wyrejestrowanego (nie wiem, czy to konieczne)” jest konieczny, inaczej napotkasz „fatal: Not a git repository: ...” podczas uruchamiania aktualizacji podmodułu git
PiersyP
10

Po prostu edytuj plik .git / config . Na przykład; jeśli masz „wspólny” podmoduł, możesz to zrobić w super-module:

git config submodule.common.url /data/my_local_common
FelipeC
źródło
Jest to najlepszy sposób, jeśli próbujesz zmienić adres URL na jednorazowy użytek, a nie na stałe w super projekcie. Np. Chcesz sklonować submoduły z lokalnych kopii na dysku.
Andy
4

git config --file=.gitmodules -e otwiera domyślny edytor, w którym możesz zaktualizować ścieżkę

LuGo
źródło