Jak usunąć submoduł Git?
Nawiasem mówiąc, czy istnieje powód, dla którego nie mogę tego zrobić
git submodule rm whatever
?
git
git-submodules
R. Martinho Fernandes
źródło
źródło
git rm modulename
irm -rf .git/modules/modulename
.git/config
. Akceptowana odpowiedź pokazuje aktualny sposób pełnego usunięcia submodułu. To również wyjaśnia bardziej zwięźle w tej odpowiedzi: stackoverflow.com/a/36593218/1562138Odpowiedzi:
Od git1.8.3 (22 kwietnia 2013 r.) :
Proces usuwania również wykorzystuje
git rm
(od git1.8.5 października 2013).Podsumowanie
3-etapowy proces usuwania wyglądałby wtedy:
Wyjaśnienie
rm -rf
: To jest wspomniane w Daniela Schroeder „s odpowiedzi i podsumować Eonil w komentarzach :git rm
: Zobacz zatwierdzenie 95c16418 :git submodule deinit
: Wynika z tej łatki :Dba o to, jeśli kroki (de) inicjalizacji (
.git/config
i.git/modules/xxx
)Od git1.8.5
git rm
dba również o:add
' krok, który rejestruje adres URL submodułu w.gitmodules
pliku: należy go usunąć.git rm --cached path_to_submodule
(bez ukośnika końcowego)Spowoduje to usunięcie tego katalogu zapisanego w indeksie specjalnym trybem „160000”, oznaczając go jako katalog główny submodułu .
Jeśli zapomnisz ten ostatni krok i spróbujesz dodać podmoduł jako zwykły katalog, otrzymasz komunikat o błędzie:
Uwaga: od wersji Git 2.17 (Q2 2018) deinit submodule git nie jest już skryptem powłoki.
Jest to wywołanie funkcji C.
Zobacz zatwierdzenie 2e61273 , zatwierdzenie 1342476 (14 stycznia 2018 r.) Przez Prathamesh Chavan (
pratham-pc
) .(Połączone przez Junio C Hamano -
gitster
- w commit ead8dbe , 13 lutego 2018)źródło
submodule deinit
?.gitmodules
powinien być w porządku, ale nadal sprawdziłbym wszystko z tym.git
katalogiem (tj. Lokalna konfiguracja, w twoim lokalnym repozytorium: to nie jest zmodyfikowany przez agit pull
).gitmodules
wpisu i usunięcie specjalnego wpisu w indeksie i wypchniesz to repozytorium, inni mogą je pobrać i ten podmoduł zniknie.git rm submodule
robi dokładnie to, co chcesz, jak już powiedzieli inni ludzie.Za pośrednictwem strony Git Submodule Tutorial :
Aby usunąć submoduł, musisz:
.gitmodules
pliku..gitmodules
zmian:git add .gitmodules
.git/config
.git rm --cached path_to_submodule
(bez końcowego ukośnika)..git
katalog submodułu :rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
Zobacz także : alternatywne kroki poniżej .
źródło
git submodule rm
po prostu usuwa rejestrację submodułu, i byłaby zaskoczona, gdyby polecenie usunęło również lokalne repozytorium. Wszelkie lokalne zmiany zostałyby bezpowrotnie utracone. Być może inna osoba pomyśli, że zostaną usunięte tylko pliki.Tylko uwaga. Od wersji git 1.8.5.2 będą wykonywane dwie komendy:
Jak słusznie wskazała odpowiedź @Mark Cheverton, jeśli druga linia nie jest używana, nawet jeśli na razie usunąłeś submoduł, pozostały folder .git / modules / the_submodule zapobiegnie dodaniu lub zastąpieniu tego samego submodułu w przyszłości . Ponadto, jak wspomniano @VonC,
git rm
wykona większość zadań w submodule.- Aktualizacja (07.05.2017) -
Dla wyjaśnienia
the_submodule
jest względna ścieżka submodułu wewnątrz projektu. Na przykład,subdir/my_submodule
jeśli podmoduł znajduje się w podkatalogusubdir
.Jak wskazano poprawnie w komentarzach i innych odpowiedziach , dwa polecenia (chociaż funkcjonalnie wystarczające do usunięcia submodułu), pozostawiają ślad w
[submodule "the_submodule"]
sekcji.git/config
(od lipca 2017 r.), Które można usunąć za pomocą trzeciego polecenia:źródło
.git/config
. Zobacz stackoverflow.com/a/36593218/1562138 do całkowitego sposobu usunięcia submodule.git init && git submodule add <repository> && git rm <name>
pozostawia po sobie.git/config
wpis oraz.git/modules/<name>
katalog i jego zawartość. Być może nie zainicjowałeś submodułu przed jego usunięciem?Większość odpowiedzi na to pytanie jest nieaktualna, niepełna lub niepotrzebnie złożona.
Podmoduł sklonowany przy użyciu git 1.7.8 lub nowszego pozostawi co najwyżej cztery ślady w twoim lokalnym repozytorium. Proces usuwania tych czterech śladów zapewnia trzy poniższe polecenia:
źródło
Proste kroki
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
rm -rf $submodulepath
rm -rf .git/modules/$submodulename
Uwaga:
$submodulepath
nie zawiera początkowych ani końcowych ukośników.tło
Kiedy to zrobisz
git submodule add
, dodaje to tylko.gitmodules
, ale kiedy to zrobiszgit submodule init
, dodaje się do.git/config
.Jeśli więc chcesz usunąć moduły, ale możesz je szybko przywrócić, wykonaj następujące czynności:
Dobrym pomysłem jest zrobienie
git rebase HEAD
najpierw igit commit
na końcu, jeśli umieścisz to w skrypcie.Zobacz także odpowiedź na pytanie Czy mogę cofnąć wypełnianie podmoduła Git? .
źródło
for dir in directory/*; do git rm --cached $dir; done
.git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'
- - wygląda na to, że naprawdę musisz to zrobić na wypadek, gdyby coś sięgit submodule | grep -v '^+' | cut -d' ' -f3
git submodule | grep '^+' | cut -d' ' -f2
submodulename
w podwójnych cudzysłowach"submodulename"
.. odnosząc się do.git/config
plikuOprócz zaleceń musiałem też
rm -Rf .git/modules/path/to/submodule
móc dodać nowy podmoduł o tej samej nazwie (w moim przypadku widelec zastępowałem oryginalnym)źródło
Aby usunąć submoduł dodany za pomocą:
Biegać:
Otóż to.
W przypadku starszych wersji git (około ~ 1.8.5) użyj:
źródło
git rm
wciąż zostawia rzeczy w środku.git/modules/
. (2.5.4)git rm
go użyjesz, to nie; Szybki test z wersją 2.5.4 na moim komputerze Mac aktualizuje plik .gitmodules, jak opisano w dokumentacji tutaj: git-scm.com/docs/git-rm#_submodules ... ale jeśli znalazłeś jakąś kombinację platformy / wersja, w której tak się nie dzieje, prawdopodobnie powinieneś zgłosić błąd.git rm
pozostawia rzeczy w katalogu.git/modules/
i.git/config
pliku (ubuntu, git 2.7.4). Inna odpowiedź działa w 100%: stackoverflow.com/a/36593218/4973698Musisz usunąć wpis w
.gitmodules
oraz.git/config
i usunąć katalog modułu z historii:Jeśli napiszesz na liście mailowej gita, prawdopodobnie ktoś zrobi dla ciebie skrypt powłoki.
źródło
Możesz użyć aliasu, aby zautomatyzować rozwiązania dostarczane przez inne osoby:
Umieść to w swojej konfiguracji git, a następnie możesz:
git rms path/to/submodule
źródło
git clone https://github.com/hilbix/empty.git; cd empty; git submodule add https://github.com/hilbix/empty.git one; git mv one two; git rms two
. PO DRUGIE: Musisz wykonać to z właściwej ścieżki.git
aliasy powinny działać w dowolnym miejscu w drzewie roboczym (lub działać bezproblemowo). PO TRZECIE:git config -f .git/config
zawodzi w podmodułach, ponieważ.git
zwykle jest tam plik.Podsumowując, oto co powinieneś zrobić:
Ustaw
path_to_submodule
var (bez końcowego ukośnika):path_to_submodule=path/to/submodule
Usuń odpowiedni wiersz z pliku .gitmodules:
git config -f .gitmodules --remove-section submodule.$path_to_submodule
Usuń odpowiednią sekcję z .git / config
git config -f .git/config --remove-section submodule.$path_to_submodule
Usuń scenę i usuń $ path_to_submodule tylko z indeksu (aby zapobiec utracie informacji)
git rm --cached $path_to_submodule
Śledź zmiany wprowadzone w .gitmodules
git add .gitmodules
Zatwierdź superprojekt
git commit -m "Remove submodule submodule_name"
Usuń nieśledzone pliki submodułów
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
źródło
git submodule update
. A jeśli ścieżki submodułów nie zostały poprawnie zaktualizowane (git zgłasza błąd), usuń je:rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
Jeśli ten podmoduł został przypadkowo dodany, ponieważ dodałeś, zatwierdziłeś i przekazałeś folder, który był już repozytorium Git (zawarty
.git
), nie będziesz miał.gitmodules
pliku do edycji ani niczego w nim.git/config
. W takim przypadku wszystko czego potrzebujesz to:FWIW , również usunąłem
.git
folder przed wykonaniemgit add
.źródło
Uważam, że
deinit
działa dla mnie dobrze:Z git docs :
źródło
git
s , które znamdeinit
, a druga odpowiedź usuwa.git/modules/submodule
katalog zbyt wcześnie, który wydaje się mieć nowszegit
s niepowodzenie teraz lub później. Również (patrz mój komentarz tam) usunięcie.git/modules/submodule
może być niewłaściwą ścieżką, więc jest to niebezpieczny krok, najlepiej podjąć później, gdygit
narzekasz (lub jeśli masz 299% pewności, że to, czego chcesz, jest właściwą ścieżką i naprawdę potrzebne).git commit
wprowadzić zmiany etapowe w reż. Roboczym:modified .gitmodules
ideleted <submodule-path>
.Po eksperymentowaniu ze wszystkimi różnymi odpowiedziami na tej stronie znalazłem rozwiązanie:
Przywraca to dokładnie ten sam stan, co przed dodaniem submodułu. Możesz od razu dodać submoduł, co nie było możliwe przy większości odpowiedzi tutaj.
To pozostawia czystą kasę bez żadnych zmian do zatwierdzenia.
Zostało to przetestowane z:
źródło
git rm --cached $path
wtedyrm -rf $path
zamiastgit rm -r $path
?git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'
-> kiedy próbujesz usunąć „niebezpieczny… submoduł” za pomocą skryptu, będzierm -rf ..
to najprawdopodobniej nie to, czego chcesz ..To, co obecnie robię, grudzień 2012 r. (Łączy większość tych odpowiedzi):
źródło
Oto co zrobiłem:
1.) Usuń odpowiednią sekcję z pliku .gitmodules. Możesz użyć poniższego polecenia:
2.) Wprowadź
.gitmodules
zmiany3.) Usuń odpowiednią sekcję z
.git/config
. Możesz użyć poniższego polecenia:4.) Usuń gitlink (bez końcowego ukośnika):
5.) Oczyść
.git/modules
:6.) Zobowiązanie:
7.) Usuń nieśledzone pliki submodułów
źródło
fatal: no submodule mapping found in .gitmodules for path 'submodule_name'
krok 3. Oba kroki były jednak konieczne. (git v2.8.2)Niedawno odkryłem projekt git, który zawiera wiele przydatnych poleceń związanych z git: https://github.com/visionmedia/git-extras
Zainstaluj i wpisz:
Potem wszystko się kończy. Katalog submodułów zostanie usunięty z repozytorium i nadal będzie istniał w systemie plików. Następnie można popełnić zmianę takiego:
git commit -am "Remove the submodule"
.źródło
git delete-submodule
, ponieważgit-extras
musi być na drodze do pracy. Zauważ też, że zalecam nie używaćgit-extras
, ponieważ wiele jego części jest bardzo wadliwych i niebezpiecznych . IEgit-delete-submodule
prawdopodobnie usuwa złą ścieżkę poniżej.git/modules/*
, ponieważ zakłada, że moduł i ścieżka są identyczne (co często nie jest przypadkiem), i nie działa poprawnie, jeśli spróbujesz usunąć submoduł w podmodule.git-extras
może być w 99% pomocny, ale proszę nie narzekać, jeśli przy jego użyciu coś pójdzie nie tak. ZOSTAŁEŚ OSTRZEŻONY!Musiałem pójść krokami Johna Douthata o krok dalej
cd
do katalogu submodułu, a następnie usunąć repozytorium Git:Następnie mógłbym zatwierdzić pliki jako część nadrzędnego repozytorium Git bez starego odwołania do submodułu.
źródło
git rm --cache
kroku.Oto 4 kroki, które uznałem za konieczne lub przydatne (najpierw najważniejsze):
W teorii ,
git rm
w kroku 1 powinien dbać o niego. Mamy nadzieję, że pewnego dnia na drugą część pytania OP można odpowiedzieć pozytywnie (że można to zrobić za pomocą jednego polecenia).Ale od lipca 2017 r. Krok 2 jest konieczny do usunięcia danych, w
.git/modules/
przeciwnym razie nie będzie można np. Ponownie dodać submodułu w przyszłości.Prawdopodobnie możesz wykonać powyższe dwa kroki dla git 1.8.5+, jak zauważono w odpowiedzi Tinlyx , ponieważ wszystkie
git submodule
polecenia wydają się działać.Krok 3 usuwa sekcję dla
the_submodule
pliku.git/config
. Należy to zrobić dla kompletności. (Wpis może powodować problemy dla starszych wersji git, ale nie mam go do przetestowania).W tym celu większość odpowiedzi sugeruje użycie
git submodule deinit
. Uważam, że jest to bardziej jednoznaczne i mniej mylące w użyciugit config -f .git/config --remove-section
. Według dokumentacji git submodule ,git deinit
:Na koniec, jeśli tego nie zrobisz
git commit
, możesz / możesz otrzymać błąd podczas wykonywaniagit submodule summary
(od git 2.7):Jest to niezależne od tego, czy wykonasz kroki 2 czy 3.
źródło
źródło
Właśnie znalazłem ukryty plik .submodule (zapomniałem dokładnej nazwy), ma on listę ... możesz w ten sposób usunąć je indywidualnie. Właśnie go miałem, więc go usunąłem. Proste, ale może zepsuć Gita, ponieważ nie wiem, czy coś jest związane z submodułem. Na razie wydaje się w porządku, oprócz zwykłego problemu z aktualizacją libetpan, ale (mam nadzieję), że nie ma to związku.
Zauważono, że nikt nie opublikował ręcznego kasowania, więc dodano
źródło
.gitmodules
W przypadku gita 2.17 i nowszych jest po prostu
źródło
git 2.17.1
anigit 2.20.1
. Jednak używaniegit rm
zamiastgit add
działało dla obu. Uwagi:-f
nie jest potrzebne, jeśli wszystko jest czyste. Pamiętaj, aby nie używać opcji zegit
jeśli chcesz chronić przed przypadkowym utraty danych. Pamiętaj też, że pozostawia to.git/modules/{module_name}
na swoim miejscu. Najlepszą praktyką jest pozostanie tam, ponieważgit
drukuje prawidłowe (!) Pomoc, jak postępować, jeśli z tego powodu coś zostanie zablokowane.Jeśli właśnie dodałeś podmoduł i na przykład po prostu dodałeś niewłaściwy podmoduł lub dodałeś go w niewłaściwe miejsce, po prostu
git stash
usuń folder. Zakłada się, że dodanie podmodułu jest jedyną rzeczą, którą zrobiłeś w ostatnim repo.źródło
Z korzyścią dla czytelnika, tutaj próbuje się to podsumować i podać krok po kroku, jak to zrobić, jeśli rzeczy nie działają zgodnie z oczekiwaniami. Poniżej znajduje się przetestowany i bezpieczny sposób na pozbycie się submodułu dla
git
wersji2.17
i wyżej :2.20.1
i Ubuntu 18.042.17.1
."$submodule"
jest po prostu podkreślenie, gdzie umieścić nazwę, i że musisz uważać na spacje i tym podobne"$submodule"
na Windows poprawnie podaną ścieżkę do submodułu. (Nie jestem Windows)Zauważ, że
jest bezpośrednią odwrotnością do
ale
jest również odwrotnie
ponieważ niektóre polecenia w zasadzie wymagają więcej niż jednej rzeczy:
git submodule deinit -- module
.git/config
git rm
.gitmodules
git submodule add
.git/modules/NAME/
git submodule init
, więc aktualizuje.git/config
git submodule update
tak więc nierekurencyjnie sprawdza moduł.gitmodules
git submodule update --init --recursive -- module
Nie może to być w pełni symetryczne, ponieważ zachowanie ścisłej symetryczności nie ma większego sensu. Po prostu nie potrzeba więcej niż dwóch poleceń. Również „pobieranie danych” jest niejawne, ponieważ jest ono potrzebne, ale usuwanie buforowanych informacji nie jest wykonywane, ponieważ nie jest to wcale potrzebne i może wyczyścić cenne dane.
To naprawdę jest zagadką dla początkujących, ale w zasadzie jest dobrą rzeczą:
git
po prostu robi to, co oczywiste, i robi to dobrze, a nawet nie próbuje robić więcej.git
to narzędzie, które musi wykonać niezawodny zawód, zamiast być kolejnym „Eierlegende Wollmilchsau” („Eierlegende Wollmilchsau” tłumaczy dla mnie „złą wersję szwajcarskiego noża wojskowego”).Rozumiem więc narzekania ludzi, mówiąc: „Dlaczego nie robi
git
dla mnie rzeczy oczywistych”. Jest tak, ponieważ „oczywiste” zależy tutaj z punktu widzenia. Niezawodność w każdej sytuacji jest znacznie ważniejsza. Dlatego to, co dla Ciebie oczywiste, często nie jest właściwe we wszystkich możliwych sytuacjach technicznych. Pamiętaj, że: AFAICSgit
podąża ścieżką techniczną, a nie społeczną. (Stąd sprytna nazwa: git)Jeśli to się nie powiedzie
Powyższe polecenia mogą się nie powieść z powodu:
git
jest za stary. Następnie użyj nowszegogit
. (Zobacz poniżej, jak to zrobić).git clean
sensie czysty . Następnie najpierw wyczyść swój moduł podrzędny za pomocą tego polecenia. (Patrz poniżej.)git
. Jesteś wtedy po ciemnej stronie, a sprawy stają się brzydkie i skomplikowane. (Być może użycie innego komputera to naprawia.)git
użytkownikiem zaawansowanym).Możliwe są następujące poprawki.
Użyj nowszej
git
Jeśli urządzenie jest zbyt stary, tam nie jest
submodule deinit
w twojejgit
. Jeśli nie chcesz (lub możesz) zaktualizować swojegogit
, skorzystaj z innego komputera z nowszymgit
!git
jest przeznaczony do pełnej dystrybucji, więc możesz użyć innego,git
aby wykonać zadanie:workhorse:~/path/to/worktree$ git status --porcelain
nie wolno niczego wydawać! Jeśli tak, najpierw posprzątaj rzeczy!workhorse:~/path/to/worktree$ ssh account@othermachine
othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
othermachine:~/TMPWORK$ git commit . -m . && exit
workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD
. Jeśli to nie zadziała, użyjgit reset --soft FETCH_HEAD
git status
oczyść rzeczy, aż znów będzie czysty. Jesteś w stanie to zrobić, ponieważ już wcześniej wyczyściłeś go, dzięki pierwszemu krokowi.Może
othermachine
to być jakaś maszyna wirtualna lub Ubuntu WSL pod Windows, cokolwiek. Nawet achroot
(ale zakładam, że nie jesteś rootem, ponieważ jeśli tak,root
to łatwiej jest zaktualizować do nowszej wersjigit
).Pamiętaj, że jeśli nie możesz
ssh
wejść, istnieje wiele sposobów transportugit
repozytoriów. Możesz skopiować swój zestaw roboczy na pamięć USB (w tym.git
katalog) i sklonować z pamięci USB . Sklonuj kopię, aby ponownie uzyskać porządek. Może to być PITA, na wypadek gdyby Twoje podmoduły nie były dostępne bezpośrednio z innej maszyny. Ale jest na to również rozwiązanie:Możesz użyć tego mnożenia, i to jest zapisane w
$HOME/.gitconfig
. Coś jakprzepisuje adresy URL takie jak
w
Łatwo jest przyzwyczaić się do
git
takich zaawansowanych funkcji.Najpierw posprzątaj rzeczy
Ręczne czyszczenie jest dobre, ponieważ w ten sposób możesz wykryć niektóre rzeczy, o których zapomniałeś.
git status
igit clean -ixfd
jest twoim przyjacielemrm
ideinit
tak długo, jak możesz. Opcje (jak-f
)git
są dobre, jeśli jesteś profesjonalistą. Ale kiedy tu przyjechałeś, prawdopodobnie nie jesteś tak doświadczony wsubmodule
okolicy. Więc lepiej bądź bezpieczny niż przykro.Przykład:
Widzisz, nie ma takiej
-f
potrzebysubmodule deinit
. W pewnymgit clean
sensie rzeczy są czyste . Pamiętaj również, żegit clean -x
nie jest to konieczne. Oznacza togit submodule deinit
bezwarunkowe usuwanie nieśledzonych plików, które są ignorowane. Jest to zwykle to, czego chcesz, ale nie zapominaj o tym. Czasami ignorowane pliki mogą być cenne, jak dane w pamięci podręcznej, których ponowne obliczenie zajmuje kilka godzin lub dni.Dlaczego nigdy nie usuwać
$GIT_DIR/modules/<name>/
?Prawdopodobnie ludzie chcą usunąć buforowane repozytorium, ponieważ boją się później napotkać problem. To prawda, ale napotkanie tego „problemu” jest właściwym sposobem na jego rozwiązanie! Ponieważ naprawa jest łatwa i wykonana poprawnie, będziesz mógł żyć długo i szczęśliwie. Pozwala to uniknąć kłopotliwych problemów niż podczas samodzielnego usuwania danych.
Przykład:
Ostatni wiersz wyświetla następujący błąd:
Dlaczego ten błąd? Ponieważ
.git/modules/two/
wcześniej był wypełniany z https://github.com/hilbix/empty.git, a teraz zostanie ponownie wypełniony z czegoś innego, mianowicie https://github.com/hilbix/src.git . Nie zobaczysz tego, jeśli ponownie wypełnisz go z https://github.com/hilbix/empty.gitCo zrobić teraz? Zrób dokładnie to, co powiedziano! Posługiwać się
--name someunusedname
.gitmodules
wtedy wygląda jakls -1p .git/modules/
dajeW ten sposób w przyszłości możesz przełączać gałęzie / zatwierdzać do przodu i do tyłu i nigdy więcej nie będziesz mieć kłopotów z powodu
two/
posiadania dwóch różnych (i prawdopodobnie niekompatybilnych) repozytoriów. A najlepsze jest to, że przechowujesz je w pamięci podręcznej również lokalnie.git
).Jeśli jednak usuniesz buforowany katalog, obie różne kasy natkną się na siebie, ponieważ nie użyjesz
--name
opcji, prawda? Dlatego za każdym razem, gdy robisz kasę, być może będziesz musiał ciągle usuwać.git/modules/<module>/
katalog. Jest to bardzo uciążliwe i utrudnia korzystanie z czegoś takiegogit bisect
.Jest więc bardzo techniczny powód, aby zachować ten katalog modułów jako symbol zastępczy. Ludzie, którzy zalecają usunięcie czegoś poniżej,
.git/modules/
albo nie wiedzą lepiej, albo zapominają powiedzieć, że powoduje to, że potężne funkcje sągit bisect
prawie niemożliwe do użycia, jeśli powoduje to niezgodność submodułu.Kolejny powód pokazano powyżej. Spójrz na
ls
. Co tam widziszCóż, drugi wariant modułu
two/
nie jest pod.git/modules/two/
, jest pod.git/modules/someunusedname/
! Takie rzeczygit rm $module; rm -f .git/module/$module
są całkowicie błędne! Musisz albo skonsultować się,module/.git
albo.gitmodules
znaleźć właściwą rzecz do usunięcia!Więc nie tylko większość innych odpowiedzi wpada w tę niebezpieczną pułapkę, nawet bardzo popularne
git
rozszerzenia miały ten błąd ( teraz jest tam naprawiony )! Więc lepiej trzymaj ręce w.git/
katalogu, jeśli nie dokładnie to, co robisz!Dla pewnie zgadłeś: hilbix to moje konto GitHub.
źródło
Podsumowując, oto co powinieneś zrobić:
Ustaw path_to_submodule var (bez końcowego ukośnika):
Usuń odpowiedni wiersz z pliku .gitmodules:
Usuń odpowiednią sekcję z .git / config
Usuń scenę i usuń $ path_to_submodule tylko z indeksu (aby zapobiec utracie informacji)
Śledź zmiany wprowadzone w .gitmodules
Zatwierdź superprojekt
Usuń nieśledzone pliki submodułów
Zobacz także: Alternatywne linie pomocnicze
źródło
git rm --cached $path_to_submodule
igit add .gitmodules
nie? Wystąpił błąd przy pierwszym poleceniu:fatal: Please stage your changes to .gitmodules or stash them to proceed
ponieważ wprowadziłem zmiany w etapie.gitmodules
. Robieniegit add .gitmodules
pierwszego rozwiązuje ten problem.To łatwe:
.gitmodules
git add .gitmodules
git submodule deinit <path to submodule>
git rm <path to submodule>
Będziesz musiał ręcznie usunąć pliki modułu z projektu.
źródło
git submodule deinit <submodule_name>
igit rm <path_to_submodule>
. Ostatnie polecenie automatycznie usuwa wpis w.gitmodules
. Git 2.17Stworzyłem skrypt bash, aby ułatwić proces usuwania. Sprawdza również, czy zmiany nie zostały zapisane w repozytorium i prosi o potwierdzenie. Testowany
os x
byłby ciekawie wiedzieć, czy działa tak samo jak w przypadku popularnych dystrybucji Linuksa:https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f
źródło
W najnowszym git potrzeba tylko 4 operacji, aby usunąć podmoduł git.
.gitmodules
git add .gitmodules
git rm --cached <path_to_submodule>
git commit -m "Removed submodule xxx"
źródło
Na wypadek, gdybyś musiał to zrobić za pomocą jednego wiersza polecenia ze skryptem bash, jak poniżej:
$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule
Utwórz plik skryptu bash w katalogu
$HOME
o nazwie np .remove_submodule.sh
:źródło
git rm <submodule path> && git commit
. Można to cofnąć za pomocągit revert
..gitmodules
pliku.$GIT_DIR/modules/<name>/
.Źródło:
git help submodules
źródło
Usuwanie podmodułu git
Aby usunąć
git
submoduł, potrzebne są 4 kroki..gitmodules
pliku. Wpis może być jak wspomniano poniżejgit add .gitmodules
git rm --cached <path_to_submodule>
.git commit -m "Removed submodule xxx"
i pchnij.Potrzebne są dodatkowe 2 kolejne kroki wymienione poniżej, aby całkowicie wyczyścić submoduł w lokalnej sklonowanej kopii.
.git/config
pliku. Wpis może być jak wspomniano poniżejrm -rf .git/modules/path_to_submodule
Te 5. i 6. kroki nie powodują żadnych zmian, które wymagają zatwierdzenia.
źródło
git submodule deinit
git-scm.com/docs/git-submodule#Documentation/…