Zmień nazwę modułu podrzędnego git

156

Czy istnieje prosty sposób na zmianę nazwy katalogu podmodułów git (inny niż przejście przez cały proces jego usunięcia i ponownego dodania z nową nazwą docelową).

A skoro już o tym mowa, dlaczego po prostu nie mogę wykonać następujących czynności w katalogu nadrzędnym: git mv old-submodule-name new-submodule-name

Lars Tackmann
źródło
6
Nie będzie już konieczne .gitmodulesręczne aktualizowanie podczas przenoszenia modułu podrzędnego. zobacz moją odpowiedź poniżej
VonC,
Odpowiedź @ VonC zadziałała dla mnie jak urok
bas laconbass
Moduły Gita są zbyt skomplikowane. npmpokazuje, jak proste działa. Pewnego dnia ... może ... ktoś ... przepisuje to ... w międzyczasie ...
Rolf
Odpowiedź @ VonC nie jest pełną historią na dzień dzisiejszy: rzeczywiście zmieni .gitmodules, ale po prostu zmieni nazwę ścieżki, a nie nazwę modułu. Potrzebujesz dodatkowej edycji w .gitmodules, aby to poprawić, i `` synchronizacji modułu podrzędnego git '', aby ukończyć pełny proces
zertyz
@zertyz: Właściwość [moduł podrzędny „nazwa_submodułu”] to wewnętrzna nazwa Git. Możesz zmienić jej nazwę, aby się nie mylić, ale jest to tylko etykieta.
MKesper

Odpowiedzi:

101

Zauważyłem, że działa następujący przepływ pracy:

  • Zaktualizuj .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Uwaga: to podejście nie aktualizuje poprawnie indeksu i .gitmodules w wersjach GIT z 2018 roku.

Uwaga: Możesz być w stanie teraz tylko zrobić git mv oldpath newpathteraz, jak wskazano w VonC „s odpowiedź . (Upewnij się, że używasz najnowszej wersji git)

Mariusz Nowak
źródło
22
uwaga dla siebie: git add newpathnie używaj końcowego ukośnika
atomicules
10
Przy takim przepływie pracy utworzysz łącze symboliczne tylko do podkatalogu, którego używasz jako modułu podrzędnego. Łącze symboliczne to tylko część funkcji globalnego modułu podrzędnego. Oznacza to, że po sklonowaniu repozytorium, które używa modułów podrzędnych o zmienionej nazwie, może zakończyć się następującym błędem: Nie znaleziono mapowania podmodułów w .gitmodules dla ścieżki „twoja-stara ścieżka”. Po usunięciu starej ścieżki (* git rm oldpath ) należy użyj podmodułu git dodaj REPO-URL nowa ścieżka zamiast „git dodaj nową ścieżkę *. Po zakończeniu stan git wyświetli coś takiego: renamed: oldpath -> newpath
Bertrand
5
To rozwiązanie nie działa dla mnie, ponieważ podczas korzystania z polecenia git add podmoduł został dołączony do projektu jako prosty katalog, a nie jako moduł podrzędny. try $ mv submodule-oldpath ~ / another-location $ git rm submodule-oldpath $ git submodule add submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adam
3
Jeśli masz problem z drzewem roboczym, możesz również edytować .git/modules/SUBMODULE/configplik, tak aby ponownie worktreewskazywał właściwy katalog.
Vincent Ketelaars
3
To nie zadziałało dla mnie z git 2.13.1. Ale po prostu robienie git mv old newdziała jak urok. Muszę tylko wykonać git commit, aby zakończyć zmiany.
użytkownik
226

Git1.8.5 (październik 2013) powinien uprościć ten proces . Po prostu zrób:

git mv A B

git mv A B”, podczas przenoszenia podmodułu Azostał nauczony, aby przenieść jego drzewo robocze i dostosować ścieżki w .gitmodulespliku .


Zobacz więcej w zatwierdzeniu 0656781fadca1 :

Obecnie użycie " git mv" na submoduule przenosi drzewo robocze submodułu w drzewo superprojektu. Ale ścieżka ustawiania submodułu .gitmodulespozostaje nietknięta, co jest teraz niespójne z drzewem roboczym i powoduje, że polecenia git, które opierają się na odpowiednich path -> name mapping(like statusi diff), zachowują się dziwnie.

Pozwól, " git mv" pomóc tutaj, nie tylko przenosząc drzewo robocze modułu podrzędnego, ale także aktualizując ustawienie " submodule.<submodule name>.path" z .gitmodulespliku i umieszczając oba elementy.
Nie dzieje się tak, gdy nie .gitmodulesznaleziono żadnego pliku i wyświetla ostrzeżenie tylko wtedy, gdy nie ma sekcji dla tego modułu podrzędnego. Dzieje się tak, ponieważ użytkownik może po prostu użyć zwykłych linków gitlinków bez .gitmodulespliku lub już ręcznie zaktualizował ustawienie ścieżki przed wydaniem polecenia „git mv” (w takim przypadku ostrzeżenie przypomina mu, mvże zrobiłby to za niego).
Dopiero gdy .gitmoduleszostanie znaleziony i zawiera konflikty scalania, mvpolecenie zakończy się niepowodzeniem i nakazuje użytkownikowi rozwiązanie konfliktu przed ponowną próbą.


git 2.9 (czerwiec 2016) poprawi się git mvdla podmodułu:

Zobacz commit a127331 (19 kwietnia 2016) autorstwa Stefana Bellera ( stefanbeller) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu 9cb50a3 , 29 kwietnia 2016 r.)

mv: pozwala na przenoszenie zagnieżdżonych podmodułów

git mv old new” nie dostosował old/poprawnie ścieżki do modułu podrzędnego, który funkcjonuje jako podkatalog w katalogu.

moduły podrzędne muszą jednak zaktualizować swoje łącze do katalogu git, a także zaktualizować .gitmodulesplik.

VonC
źródło
Uwaga dla siebie: wypróbuj to na 1.8.4, a będziesz mieć fatal: source directory is empty, source=my_source, destination=my_destination. Spróbuję ponownie, gdy 1.8.5 będzie mieć stabilną wersję.
suma kontrolna
@checksum Ale 1.8.5 ma stabilną wersję przez co najmniej kilka ... godzin;) github.com/git/git/releases/tag/v1.8.5
VonC
Musiałem zbudować Git w wersji 1.8.5.GIT z kodu źródłowego, ponieważ w repozytoriach Ubuntu jest Git v.1.7.5. Jak zbudować Gita z kodu źródłowego
Maksim Dmitriev
2
@MaksimDmitriev, ale co z ppa (archiwum pakietów osobistych), o którym wspomniałem na stackoverflow.com/a/20918469/6309 ?
VonC,
2
git mv po prostu nie działa w tym celu na moim komputerze.
Alexander Dyagilev
11

Właśnie wypróbowałem kilka z sugerowanych powyżej. Biegnę:

$ git --version
git version 1.8.4

Zauważyłem, że najlepiej jest wyrejestrować moduł podrzędny, usunąć katalog i utworzyć nowy moduł podrzędny.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Przynajmniej to działało dla mnie najlepiej. YMMV!

jaredwolff
źródło
7

Nie można zmienić jego nazwy, więc najpierw musisz go usunąć ( deinit) i dodać ponownie.

Więc po usunięciu:

git submodule deinit <path>
git rm --cached <path>

możesz również dwukrotnie sprawdzić i usunąć odniesienia do niego w:

  • .gitmodules
  • .git/config
  • usuń folder odniesienia z .git/modules/<name>(najlepiej wykonać kopię zapasową), ponieważ każdy folder zawiera configplik, w którym zachowuje odniesienie do swojegoworktree

następnie przygotuj zmiany, dokonując wszelkich zmian w repozytorium poprzez:

git commit -am 'Removing submodule.'

i dokładnie sprawdź, czy nie masz żadnych nierozwiązanych problemów:

git submodule update
git submodule sync
git submodule status

więc teraz możesz ponownie dodać podmoduł git:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
kenorb
źródło
tak naprawdę jest dzisiaj
Alexey
Tytuł pytania jest mylący, dotyczy ścieżki, a nie nazwy
Max Robbertze
3

Edytuj plik .gitmodules, aby zmienić nazwę modułu podrzędnego, a następnie zmień nazwę katalogu modułu podrzędnego.

Myślę, że będziesz musiał to zrobić git submodule syncpóźniej, ale nie jestem teraz w stanie tego sprawdzić.

Abizern
źródło
Powoduje to, że nowa nazwa modułu podrzędnego pojawia się jako nowe zatwierdzenie, a nie jako zmiana nazwy. Ale może tak właśnie musi być?
Lars Tackmann
1
@Lars: Pamiętaj, aby usunąć również stary katalog podmodułów!
Cascabel
3

MacOs : Kiedy chcę użyć rozwiązania VonC, aby zmienić folder podmodułu Commonna małe litery:

git mv Common common

dostaję

fatal: zmiana nazwy „Common” nie powiodła się: nieprawidłowy argument

Rozwiązanie - użyj nazwy folderu tymczasowego i przesuń dwukrotnie:

git mv Common commontemp
git mv commontemp common

To wszystko :)

Kamil Kiełczewski
źródło