Chciałbym zmienić nazwę katalogu submodułu Git w moim superprojekcie Git.
Załóżmy, że mam następujący wpis w moim .gitmodules
pliku:
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
Co muszę wpisać, aby przenieść .emacs.d/vimpulse
katalog .emacs.d/vendor/vimpulse
bez uprzedniego usunięcia go (wyjaśnione
tutaj i tutaj ), a następnie dodania go ponownie.
Czy Git naprawdę potrzebuje całej ścieżki w znaczniku submodułu
[submodule ".emacs.d/vimpulse"]
lub czy można również zapisać tylko nazwę podprojektu?
[submodule "vimpulse"]
git
git-submodules
strzecha
źródło
źródło
git mv
poleceniem bezpośrednio w pytaniu.git mv
. Użyjdeinit
wtedy,rm
jak określono stackoverflow.com/a/18892438/8047 .git mv
działa również dla podmodułów, nie trzeba nic więcej.1.8.5
ruchome podmoduły są obsługiwane natywnie za pomocągit mv
polecenia ( z informacji o wersji , najpierw połączonych przez samego @thischa). Odpowiedziałgit mv
przesuwa submoduł w obszarze roboczym i poprawnie aktualizuje pliki .git submodułu, ale podfolder w folderze .git / modules repozytorium nadrzędnego pozostaje taki sam - czy to w porządku? (Używam gita 2.19.0 w systemie Windows)Odpowiedzi:
Uwaga: Jak wspomniano w komentarzach, ta odpowiedź odnosi się do kroków wymaganych w starszych wersjach git. Git ma teraz natywne wsparcie dla przenoszenia submodułów:
Proces jest podobny do sposobu usuwania submodułu (zobacz Jak usunąć submoduł? ):
.gitmodules
i zmień odpowiednio ścieżkę submodułu i umieść ją w indeksie za pomocągit add .gitmodules
.mkdir -p new/parent
).mv -vi old/parent/submodule new/parent/submodule
).git add new/parent
).git rm --cached old/parent/submodule
..git/modules/old/parent/submodule
z całą zawartością do.git/modules/new/parent/submodule
..git/modules/new/parent/config
plik, upewnij się, że element z drzewa roboczego wskazuje nowe lokalizacje, więc w tym przykładzie powinno to byćworktree = ../../../../../new/parent/module
. Zazwyczaj..
w bezpośredniej ścieżce w tym miejscu powinny znajdować się dwa katalogi więcej niż katalogi.Edytuj plik
new/parent/module/.git
, upewnij się, że ścieżka w nim wskazuje poprawną nową lokalizację w głównym.git
folderze projektu , więc w tym przykładziegitdir: ../../../.git/modules/new/parent/submodule
.git status
dane wyjściowe wyglądają dla mnie następująco:Na koniec zatwierdz zmiany.
źródło
path
konfigurację, jak i nazwę submodułu. Na przykład, przy przenoszeniu foo / module do bar / module musisz zmienić w .gitmodules sekcję[submodule "foo/module"]
na[submodule "bar/module"]
i pod tą samą sekcjąpath = foo/module
napath = bar/module
. Musisz także zmienić w .git / config sekcję[submodule "foo/module"]
na[submodule "bar/module"]
.fatal: 'git status --porcelain' failed in...
tylko pliki .git lub katalogi w podmodule..git/modules/old/parent/submodule
, przeniesienie go do nowej lokalizacji, aktualizacjagitdir
wold/parent/submodule/.git
...git mv old/submod new/submod
działa zgodnie z oczekiwaniami i wykonuje całą instalację wodociągową. Prawdopodobnie zechcesz użyć git 1.9.3+, ponieważ zawiera on poprawki do przenoszenia submodułów.Najnowocześniejsza odpowiedź zaczerpnięta z powyższego komentarza Vallorica:
git mv old/submod new/submod
git status
.)git commit
i możesz zacząć!Gotowy!
źródło
1.9.3
wyjątkiem podmodułu w przeniesionym podmodule. To wymagało ręcznego czyszczenia.1.8.5
opisanej w uwagach do wydania ..gitmodules
plik,old/submod
nadal będzie on używany jako etykieta submodułu, gdy ścieżka zostanie zmieniona. Aby zmienić również etykietę, wydaje się, że musisz przenieść ścieżkę do katalogu modułów.git
, a następnie ręcznie zmienić etykietę.gitmodules
.W moim przypadku chciałem przenieść submoduł z jednego katalogu do podkatalogu, np. „AFNetworking” -> „ext / AFNetworking”. Oto kroki, które wykonałem:
[core] worktree
linię. Mój zmienił się z../../../AFNetworking
na../../../../ext/AFNetworking
gitdir
. Mój zmienił się z../.git/modules/AFNetworking
na../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
Wreszcie zobaczyłem w statusie git:
Zrobione. Powyższy przykład nie zmienia głębokości katalogu, co ma duży wpływ na złożoność zadania i nie zmienia nazwy submodułu (co może nie jest tak naprawdę konieczne, ale zrobiłem to, aby zachować spójność z tym, co tak by się stało, gdybym dodał nowy moduł na tej ścieżce).
źródło
[Aktualizacja: 26.11.2014] Jak Yar ładnie podsumowuje poniżej, zanim cokolwiek zrobisz, upewnij się, że znasz adres URL podmodułu. Jeśli jest nieznany, otwórz
.git/.gitmodules
i sprawdź kluczsubmodule.<name>.url
.Dla mnie zadziałało usunięcie starego podmodułu za pomocą,
git submodule deinit <submodule>
a następniegit rm <submodule-folder>
. Następnie ponownie dodaj submoduł z nową nazwą folderu i zatwierdź. Sprawdzanie statusu git przed zatwierdzeniem pokazuje, że stary podmoduł został przemianowany na nową nazwę i zmodyfikowany .gitmodule.źródło
Sztuką wydaje się być zrozumienie, że
.git
katalog podmodułów jest teraz przechowywany w głównym repozytorium pod.git/modules
, a każdy podmoduł ma.git
plik, który na to wskazuje. Oto procedura, której potrzebujesz teraz:.git
plik w katalogu roboczym podmodułu i zmodyfikuj zawartą w nim ścieżkę, tak aby wskazywał właściwy katalog w katalogu głównego repozytorium.git/modules
..git/modules
katalogu głównego repozytorium i znajdź katalog odpowiadający Twojemu podmodułowi.config
plik, aktualizującworktree
ścieżkę, tak aby wskazywała nową lokalizację katalogu roboczego podmodułu..gitmodules
plik w katalogu głównym repozytorium głównego, aktualizując ścieżkę do katalogu roboczego podmodułu.git add -u
git add <parent-of-new-submodule-directory>
(Ważne jest, aby dodać nadrzędny , a nie sam katalog podmodułu).Kilka uwag:
[submodule "submodule-name"]
linie.gitmodules
i.git/config
musi pasować do siebie, ale nie odpowiadają cokolwiek innego..git
katalog muszą poprawnie wskazywać na siebie..gitmodules
I.git/config
pliki powinny być zsynchronizowane.źródło
Ciąg w cudzysłowie po „[submodule” nie ma znaczenia. Możesz go zmienić na „foobar”, jeśli chcesz. Służy do znalezienia pasującego wpisu w „.git / config”.
Dlatego, jeśli dokonasz zmiany przed uruchomieniem „git submodule init”, będzie działać dobrze. Jeśli dokonasz zmiany (lub przejmiesz ją poprzez scalenie), będziesz musiał albo ręcznie edytować .git / config lub ponownie uruchomić „git submodule init”. Jeśli zrobisz to drugie, pozostanie ci nieszkodliwy wpis „spleciony” ze starą nazwą w .git / config.
źródło
git submodule sync
propaguje zmianę.git/config
automatycznieMożesz po prostu dodać nowy submoduł i usunąć stary submoduł za pomocą standardowych poleceń. (powinien zapobiec przypadkowym błędom w .git)
Przykładowa konfiguracja:
Przykład przeniesienia „jquery” do „vendor / jquery / jquery”:
Metoda bonusowa dla dużych submodułów:
Jeśli podmoduł jest duży i wolisz nie czekać na klon, możesz utworzyć nowy podmoduł, używając starego jako źródła, a następnie przełączyć źródło.
Przykład (użyj tej samej konfiguracji przykładowej)
źródło
newPath
.Podane rozwiązanie nie działało dla mnie, jednak podobna wersja działała ...
Dzieje się tak ze sklonowanym repozytorium, dlatego podmoduły repozytorium git znajdują się w najlepszych repozytoriach .git reż. Wszystkie kationy pochodzą z górnego repozytorium:
Edytuj .gitmodules i zmień ustawienie „path =” dla danego submodułu. (Nie trzeba zmieniać etykiety ani dodawać tego pliku do indeksu).
Edytuj .git / modules / name / config i zmień ustawienie „worktree =” dla danego podmodułu
biegać:
Zastanawiam się, czy robi to różnicę, jeśli repozytoria są atomowe, czy względne submoduły, w moim przypadku były względne (submoduł / .git jest odnośnikiem do topproject / .git / modules / submodule)
źródło
Wystarczy użyć skryptu powłoki git-submodule-move .
źródło
Właśnie przeszedłem tę próbę wczoraj i ta odpowiedź zadziałała idealnie. Oto moje kroki dla jasności:
more .gitmodules
ponieważ po usunięciu submodułu nie będzie go w pobliżudeinit
,rm
a następniesubmodule add
PRZYKŁAD
POLECENIA
UWAGA: git mv tego nie robi. W ogóle.
źródło
git mv
powinno być lepsze w ostatnich wersjach Gita.mv
. Dzięki!