2009-05-27 10 views
477

Stworzyłem repozytorium git z modułem częściowym. Jestem w stanie powiedzieć modułowi samemu, aby zmienił ścieżkę zdalnego repozytorium, ale nie jestem pewien, jak powiedzieć repozytorium nadrzędnemu, jak zmienić ścieżkę zdalnego repozytorium dla modułu.Zmienianie zdalnego repozytorium dla submodule git

Nie byłbym zaskoczony, gdybym miał trochę szczęścia i musiałbym robić wszystko ręcznie, ponieważ nawet submoduły deleting nie są łatwe.

Odpowiedz

711

Powinieneś być w stanie edytować plik .gitmodules, aby zaktualizować adres URL, a następnie uruchomić git submodule sync, aby odzwierciedlić tę zmianę w superprojekcie i kopii roboczej.

+1

Co wpływają powinno git modułem synchronizacji mieć? Czy robię to nieprawidłowo na http://gist.github.com/120723, czy też jestem niepoprawny w oczekiwaniu na zmianę .git/config przez synchronizację git submodule? –

+16

To nie wydaje się aktualizować .git/config, przynajmniej w wersji 1.7.1 lub 1.7.3. – notJim

+5

Zaktualizował dla mnie '.git/config', mam git 1.7.5.4. – mxcl

52

W rzeczywistości łatka has been submitted in April 2009 do wyjaśnienia roli gitmodule.

Więc teraz gitmodule documentation nie zawiera jeszcze:

Plik .gitmodules, znajduje się w katalogu najwyższego poziomu drzewa roboczego git, to plik tekstowy o składni dopasowywania wymagań -W linkgit: git-config 1.
[NOWOŚĆ]:
Ponieważ ten plik jest zarządzany przez Git, śledzi on + zapisy podmodułów projektu.
Informacje przechowywane w tym pliku służą jako wskazówka do przygotowania wiarygodnej wersji rekordu zapisanego w pliku konfiguracyjnym projektu.
Zmiany rekordów użytkownika (np. Uwzględnienie różnic w modułach URL stron z powodu sytuacji sieciowych) należy wprowadzić do pliku konfiguracyjnego, , podczas gdy rekordowe zmiany, które mają być propagowane (np. + Z powodu przeniesienia źródła częściowego), powinny zostać wykonane do tego pliku.

To wystarczy potwierdzić Jim's answer.


Jeśli zastosujemy ten git submodule tutorial, widać trzeba „git submodule init”, aby dodać adres URL repozytorium modułem do .git/config.

"git submodule sync" ma dokładnie to, co jest łatwiejsze, gdy zmienia się adres URL (szczególnie jeśli liczba podmodul jest ważna).
Stowarzyszonej skrypt z tego polecenia jest dosyć prosta:

module_list "[email protected]" | 
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"

+0

Chciałem zmienić adres URL modułu tylko na tym komputerze. Z projektu nadrzędnego mogłem zmodyfikować rekord w '.git/config', wykonując polecenie:' module konfiguracyjnym git config. "$ Nazwa moduła" .url "$ new_url" 'który jest [również opisany tutaj] (http: // stackoverflow. com/a/928539/99777). – joeytwiddle

8

Wystarczy edytować .git/config plik. Na przykład; jeśli masz "wspólny" submodule można to zrobić w super-module:

git config submodule.common.url /data/my_local_common 
56

Co pracował dla mnie (w systemie Windows, używając wersji git 1.8.3.msysgit.0):

  • Zaktualizuj .gitmodules ze ścieżką do nowego repozytorium
  • Usuń odpowiednią linię z ".git/config "file
  • Usuń odpowiedni katalog w" .git/modułów/zewnętrznego”katalogu
  • Usuń wyrejestrowany samego katalogu submodule (nie wiem, czy jest to konieczne)
  • Run git submodule init i git submodule update
  • Upewnij się, że wyrejestrowany modułem jest poprawna popełnić, i zobowiązać się, że skoro to jest prawdopodobne, że hash będzie inna

Po wykonaniu wszystkich, że wszystko jest w stanie chciałbym się spodziewać. Wyobrażam innych użytkowników repozytorium będzie miało sim Jeśli jednak dojdzie do aktualizacji, to znaczy, że mądrze byłoby wyjaśnić te kroki w wiadomości o zatwierdzeniu!

+2

Dziękuję bardzo za to. Jest to jedyna, która działała dla mnie po tym, jak już uruchomiłem aktualizację modułu "git submodule". Podążanie za innymi odpowiedziami nie zmieniłoby tego, co było w kodzie './Git/modules/external', więc próba aktualizacji spowodowałaby, że wciąż ciągnąłby niepoprawny adres URL. – NtscCobalt

+0

to wydaje się być trochę niebezpieczne i nie jestem pewien, czy zachowuje historię poprzedniego modułu. Jeśli, na przykład, chcesz sprawdzić stary commit lub gałąź twojego głównego repozytorium (ten zawierający submoduł), nie jestem pewien, czy będzie on mógł pobrać dołączony moduł OLD i powiązany z tym starym commitem głównego . –

+0

Nie, prawie na pewno nie będzie wiadomo - będziesz musiał wykonać wszystkie czynności po pierwszym. Właśnie to znalazłem, pracowałem nad nukingiem obecnego stanu modułu. Nie wiem, czy stan rzeczy się zmienił odkąd to napisałem, umysłu :) –

71

Polecenia te będą wykonywać pracę w wierszu polecenia bez zmieniania żadnych plików na 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 

Proszę spojrzeć na blogu screenów: Changing GIT submodules URL/Branch to other URL/branch of same repository

+4

To zadziałało ale musiałem pamiętać, aby przesunąć zmiany na pilocie. 'git add .gitmodules'' git commit -m "zmodyfikowany moduł modułowy URL" '' git push origin master' – skulz00

+0

Dziękujemy za aktualizację. Zapomniałem dodać polecenie git add/commit/push. –

+2

To stworzyło dla mnie okropny bałagan. Polecenia zanikły cicho, ale rzeczywiste repozytorium modułów wciąż myśli, że jego pilot jest stary (stary adres URL). Może tym poleceniom powinny towarzyszyć inne polecenia w repozytorium modułu? –

3

git config --file=.gitmodules -e otwiera domyślny edytor, w którym można aktualizować ścieżka

19

W prostych słowach wystarczy edytować plik .gitmodules, a następnie zsynchronizować i zaktualizować:

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

git config --file=.gitmodules -e 

lub po prostu:

vim .gitmodules 

następnie zsynchronizować i zmiana:

git submodule sync 
git submodule update --init --recursive --remote 
Powiązane problemy