Jak zamienić podmoduł Git na inne repozytorium?

97

Jak zamienić podmoduł git na inne repozytorium git?

W szczególności mam podmoduł:

  • znajduje się w ./ExternalFrameworks/TestFrameworktych punktach do repozytorium git[email protected]:userA/TestFramework.git
  • Chciałbym, żeby to teraz wskazywało [email protected]:userB/TestFramework.git.

Problem w tym, że kiedy usuwam podmoduł metodą opisaną tutaj , to ponownie go dodam poleceniem

git submodule add [email protected]:userB/TestFramework.git

Otrzymuję ten błąd:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]: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.
joseph.hainline
źródło
1
możliwy duplikat Zmiana zdalnego repozytorium dla
modułu podrzędnego

Odpowiedzi:

124

Jeśli lokalizacja (adres URL) podmodułu uległa zmianie, możesz po prostu:

  1. Zmodyfikuj .gitmoduleplik, aby używał nowego adresu URL
  2. Usuń folder podmodułów w repozytorium rm -rf .git/modules/<submodule>
  3. Usuń folder podmodułu w katalogu roboczym rm -rf <submodule>
  4. Biegać git submodule sync
  5. Biegać git submodule update

Więcej informacji można znaleźć w innym miejscu:

Tim Henigan
źródło
4
Warto również zauważyć: gdy inny użytkownik (który już zainicjował podmoduł) otrzyma twoją aktualizację, będzie musiał również wykonać „git submodule sync” jeden raz, zanim nowy podmoduł będzie dla nich działał.
joseph.hainline
2
To nie zadziałało dla mnie. Po tym mój podmoduł nadal wskazywał na stary adres URL. Jakieś pomysły, dlaczego?
Arne
34
@Arne Być może Twój moduł podrzędny nigdy nie został poprawnie zainicjowany. Musiałem to zrobić, rm -rf .git/modules/<submodule>zanim to zadziałało.
David Braun,
@DavidBraun Mam ten sam problem co @Arne, chociaż robię to git submodule syncpo rm -rf .git/modules/<submodule>daje fatal: Not a git repository: ../.git/modules/<submodule>. Jakieś wskazówki? Początkowo utworzyłem git submodule add https://<submodule-url>
moduł podrzędny
1
Następnie musiałem przejść do katalogu modułu, wyewidencjonować gałąź, którą chcę, a następnie git pull.
Nicolas Raoul,
34

Po pierwsze, usunąć bieżący submodule z metody już wspomniano tutaj , co ja w tym dla wygody:

  • Usuń odpowiednią sekcję z .gitmodules pliku
  • Usuń odpowiednią sekcję z .git/config
  • Biegać git rm --cached path_to_submodule (bez końcowego ukośnika)
  • Zatwierdź i usuń teraz nieśledzone pliki modułu podrzędnego

Teraz dodaj nowy moduł podrzędny z --nameflagą. To da gitowi alternatywną nazwę do odniesienia się .git/configdo podmodułu, aby zdekonfliktować z podmodułem, który istniał w przeszłości, nad którym nadal chcesz pracować w swojej wcześniejszej historii.

Więc wpisz:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

a moduł podrzędny zostanie załadowany zgodnie z oczekiwaniami.

joseph.hainline
źródło
2
Chociaż ten sposób działa, nie jest tak czysty jak metoda Tima.
joseph.hainline
4
To zadziałało dla mnie, ale musiałem też usunąć .git/modules/<path_to_submodule>.
Nate
1
Doceń odniesienie do --name. Nie byłem świadomy problemów z tym związanych i nie mogłem wymienić submodułu, dopóki nie skorzystałem z tej opcji (dzięki Twojej odpowiedzi).
aknuds 1
Stało się to jedyną metodą, która działała dla mnie, jednak chciałem zachować tę samą nazwę katalogu. Sprawdził poprawną ścieżkę i nadał modułowi żądaną nazwę, ale nazwa katalogu roboczego była nazwą nowego repozytorium. Więc jeśli chcesz mieć tę samą nazwę, musisz również określić, że na końcu adresu URL: git submodule add --name old-name-to-keep [email protected]:userB/new-repository.git old-name-to-keep
rgb
9

Te polecenia wykonają pracę w wierszu polecenia bez zmiany jakichkolwiek plików w repozytorium lokalnym.

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
Pavan Sokke Nagaraj
źródło
5

To, co mnie naprawiło, było w katalogu głównym repozytorium git (nie w module podrzędnym), uruchom

rm -rf .git/modules/yourmodule

Wtedy powinno być możliwe normalne dodawanie.

hobberwickey
źródło
3

Najłatwiejszy sposób, jaki znalazłem, to:

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

Nie podobał mi się pomysł .gitmodulesręcznej modyfikacji mojego pliku. Napisałem też o tym mały wpis na blogu .

DerZyklop
źródło
2

Jeśli chcesz zmienić zdalny adres URL tylko dla tego klonu :

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

Nie wpłynie to na .gitmodulesplik w projekcie nadrzędnym, więc nie będzie propagowany do innych programistów.

Jest to opisane jako „specyficzne zmiany rekordu użytkownika” tutaj .

Nie rób uruchamiaj, git submodule syncponieważ spowoduje to ponowne przywrócenie domyślnego adresu URL.

joeytwiddle
źródło