Pytanie Jak mogę usunąć moduł?


Jak mogę usunąć moduł modułowy Git?

A propos, czy istnieje powód, którego nie mogę po prostu zrobić

git submodule rm whatever

?


3024
2017-08-11 14:31


pochodzenie


Prosta odpowiedź stackoverflow.com/a/21211232/94687 jest teraz poprawny i powinien być oznaczony tak. Teraz jest po prostu git rm modulename i rm -rf .git/modules/modulename - imz -- Ivan Zakharyaschev
To nie jest prawda. Ta odpowiedź nie dotyczy usunięcia wpisu modułu podmiennego z .git/config. Przyjęta odpowiedź pokazuje aktualny sposób całkowitego usunięcia modułu. Wyjaśniono to również w sposób zwięzły w tej odpowiedzi: stackoverflow.com/a/36593218/1562138 - fvgs
Znalazłem ten artykuł bardzo pomocny w usuwaniu submodułów. Zawiera informacje o usuwaniu wpisów w plikach .gitsubmodules i .git / config połączyć - Ri_
Oszczędzaj trochę czasu i bezpośrednio idź do odpowiedzi, która działa (w 2017 r.): stackoverflow.com/a/36593218/528313 - Vincenzo Pii
Przez dwa dni zmagałam się z modułem submodułowym. Przełom nastąpił, gdy znalazłem to: forums.developer.apple.com/thread/13102. Zasadniczo, Xcode i być może inne aplikacje, mają problemy z rozwinięciem adresów URL zawierających "~". Po zmianie ssh: //nazwa_użytkownika@serwer.remoteHost.com/~/git/MojeRepo.git na ssh: //nazwa_użytkownika@serwer.remoteHost.com/domena/nazwa_użytkownika/git/MojeRepo.git (sprawdź aktualną ścieżkę na twoim serwerze), wszystkie dziwactwa zniknęły z dziesięć minut. Zobacz też stackoverflow.com/questions/32833100/... - Elise van Looij


Odpowiedzi:


Od git1.8.3 (22 kwietnia 2013 r.):

Nie było sposobu, aby powiedzieć "nie interesuje mnie już ten moduł", po wyrażeniu zainteresowania modułem częściowym z "submodule init".
  "submodule deinit"to sposób na zrobienie tego.

Wykorzystywany jest także proces usuwania git rm (od git1.8.5 października 2013 r.).

Podsumowanie

Proces usuwania trzech kroków będzie wtedy:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

Wyjaśnienie

rm -rf: Jest to wspomniane w Daniel Schroeder„s odpowiedźi podsumowane przez Eonil w komentarze:

To odchodzi .git/modules/<path-to-submodule>/ niezmienione.
  Jeśli więc raz usuniesz submoduł za pomocą tej metody i ponownie dodasz je ponownie, nie będzie to możliwe, ponieważ repozytorium zostało już uszkodzone.


git rm: Widzieć popełnić 95c16418:

Obecnie używasz "git rm"na module częściowym usuwa drzewo robocze modułu pomocniczego z drzewa nadprojektowego i łącza gitlink z indeksu.
  Ale sekcja submoduły w .gitmodules pozostaje nietknięty, co jest resztką obecnie usuniętego modułu i może drażnić użytkowników (w przeciwieństwie do ustawienia w .git/config, to musi pozostać jako przypomnienie, że użytkownik wykazał zainteresowanie tym modułem częściowym, więc zostanie on ponownie zaludniony później, gdy starszy commit zostanie wyrejestrowany).

Pozwolić "git rm"pomóż użytkownikowi, nie tylko usuwając submoduł z drzewa roboczego, ale także usuwając"submodule.<submodule name>"sekcja z .gitmodules plik i etap oba.


git submodule deinit: To wynika z ta łatka:

Z "git submodule init"użytkownik jest w stanie powiedzieć git, że dbają o jeden lub więcej submodułów i chce, aby był on wypełniony przy następnym wywołaniu"git submodule update".
  Ale obecnie nie ma łatwego sposobu, żeby mogli powiedzieć git, że nie dbają już o submoduł i chcą pozbyć się lokalnego drzewa pracy (chyba, że ​​użytkownik wie dużo o wewnętrznych modułach i usuwa "submodule.$name.url"ustawienie z .git/config razem z drzewem roboczym).

Pomóż tym użytkownikom, zapewniającdeinit' dowództwo.
  To usuwa całość submodule.<name> sekcja od .git/config albo dla danego   moduł (moduły) (lub dla wszystkich tych, które zostały zainicjowane, jeśli ".' jest podawany).
  Niepowodzenie, jeśli bieżące drzewo robocze zawiera modyfikacje, chyba że zostało wymuszone.
  Złóż skargę, gdy dla modułu podanego w wierszu poleceń nie można znaleźć ustawienia adresu URL .git/config, ale mimo wszystko nie zawiedzie.

Dba o to, jeśli kroki de () inicjalizacji (.git/config i .git/modules/xxx)

Od git1.8.5, git rm trwa również opieka nad:

  • "add"krok, który rejestruje adres URL modułu podrzędnego w .gitmodules plik: należy go usunąć.
  • submoduł specjalne wejście (jak ilustruje to to pytanie): git rm usuwa go z indeksu:
    git rm --cached path_to_submodule(bez ukośnego ukośnika)
    Spowoduje to usunięcie katalogu zapisanego w indeksie w specjalnym trybie "160000", oznaczającym go jako katalog główny podmodułu.

Jeśli zapomnisz tego ostatniego kroku i spróbujesz dodać moduł podległości jako zwykły katalog, pojawi się komunikat o błędzie, taki jak:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Uwaga: od Git 2.17 (Q2 2018), deinit git submodule nie jest już skryptem powłoki.
Jest to wywołanie funkcji C.

Widzieć commit 2e61273, zatwierdź 1342476 (14 stycznia 2018 r.) Wg Prathamesh Chavan (pratham-pc).
(Scalone przez Junio ​​C Hamano - gitster - w commit ead8dbe, 13 lutego 2018 r.) 

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

1799
2018-04-23 05:57



Czy możesz podać przykład użycia dla submodule deinit? - zakdances
@yourfriendzak to jeden z przykładów osób, które z powodzeniem go używają: stackoverflow.com/a/16161950/6309. Należy jednak pamiętać, że wbrew temu, co pierwotnie sądziłem, 1.8.3 nie zostało jeszcze wydane! Na Uniksie możesz skompilować go ze źródeł. - VonC
@HamishDowner specjalny wpis powinien zniknąć (katalog nie jest już modułem podrzędnym), a .gitmodules powinno być w porządku, ale jeszcze dwukrotnie sprawdziłbym wszystko z .git katalog (tj lokalny config, w lokalnym repo: który nie jest modyfikowany przez git pull) - VonC
@Jayen tak, jeśli popełnisz usunięcie .gitmodules wejście i usunięcie specjalnego wpisu w indeksie, i popchnięcie tego repo, inni mogą go wyciągnąć i ten submoduł zniknie. - VonC
Oto skrypt, który automatyzuje te kroki: gist.github.com/sharplet/6289697. Dodaj to do swojego PATH i git remove-submodule path/to/submodule. - Adam Sharp


Przez stronę Git Submodule Tutorial:

Aby usunąć moduł częściowy, musisz:

  1. Usuń odpowiednią sekcję z .gitmodules plik.
  2. Etap .gitmodules zmiany git add .gitmodules
  3. Usuń odpowiednią sekcję z .git/config.
  4. Biegać git rm --cached path_to_submodule (bez ukośnego ukośnika).
  5. Biegać rm -rf .git/modules/path_to_submodule
  6. Popełnić git commit -m "Removed submodule <name>"
  7. Usuń teraz niepobrane pliki submodułów
    rm -rf path_to_submodule

Zobacz też: alternatywne kroki poniżej.


3145
2018-01-18 23:30



- A tak przy okazji, czy jest jakiś powód, dla którego nie mogę po prostu wymodelować czegoś takiego? ? - abernier
@abernier Odpowiedź może być krótka "ponieważ takie polecenie nie istnieje". Domyślam się, że starają się, aby usuwanie modułów submoduli i modułów podległych było jednoznaczne, aby uniknąć przypadkowej utraty danych. Być może jedna osoba by tak pomyślała git submodule rm po prostu usuwa rejestrację modułu i byłby zaskoczony, gdyby polecenie również usunęło lokalne repozytorium. Wszelkie lokalne zmiany zostaną bezpowrotnie utracone. Być może inna osoba pomyślałaby, że tylko pliki zostaną usunięte. - John Douthat
Szczerze mówiąc, nie wiem dlaczego. Mam nadzieję, że dodadzą polecenie. Te 4 kroki są zbyt skomplikowane. - John Douthat
Oto skrypt bash, który usuwa submoduł, po prostu utwórz alias git dla submodule-rm;) gist.github.com/2491147 - Capi Etheriel
również potrzebujesz rm -rf .git \ modules \ nazwa modułu? - rogerdpack


Tylko uwaga. Od git 1.8.5.2, będą wykonywać dwie komendy:

git rm the_submodule
rm -rf .git/modules/the_submodule

Jak słusznie zauważyła odpowiedź @ Mark Cheverton, jeśli druga linia nie zostanie użyta, nawet jeśli na razie usunięto moduł cząstkowy, pozostały folder .git / modules / the_submodule uniemożliwi dodanie lub zastąpienie tego samego modułu podległego w przyszłości . Również, jak wspomniał @VonC, git rm wykona większość pracy na module częściowym.

- Aktualizacja (07/05/2017) -

Aby wyjaśnic, the_submodule jest względną ścieżką modułu podrzędnego wewnątrz projektu. Na przykład jest subdir/my_submodule jeśli submoduł znajduje się w podkatalogu subdir.

Jak wskazano poprawnie w komentarzach i inne odpowiedzi, dwa polecenia (chociaż funkcjonalnie wystarczające do usunięcia submodułu), pozostawiają ślad w [submodule "the_submodule"] Sekcja .git/config (stan na lipiec 2017), który można usunąć za pomocą trzeciego polecenia:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

332
2018-04-13 08:51



Jestem na git w wersji 2.4.9 (Apple Git-60) i wszystko, co musiałem zrobić, to rm the_submodule. Popchnąłem to, a następnie ponownie dodałem folder o nazwie identyczny z modułem częściowym, który działał bez problemu. - David Silva Smith
Nie powoduje to usunięcia wpisu modułu pomocniczego z .git/config. Widzieć stackoverflow.com/a/36593218/1562138 dla pełnego sposobu na usunięcie modułu. - fvgs
Jest to w 100% absolutnie genialne i działa. Łał. - Dan Rosenstark
@drevicko Właśnie testowałem to z Git 2.11.1 i obserwuję to samo zachowanie co poprzednio. git init && git submodule add <repository> && git rm <name> pozostawia za sobą .git/config wpis i .git/modules/<name> katalog i jego zawartość. Być może nie zainicjalizowałeś modułu przed jego usunięciem? - fvgs
Czuję się bezpieczniej uruchamiając ten pierwszy .. git submodule deinit -f the_submodule - danday74


Większość odpowiedzi na to pytanie jest nieaktualna, niekompletna lub niepotrzebnie skomplikowana.

Moduł cząstkowy sklonowany za pomocą git 1.7.8 lub nowszego pozostawi maksymalnie cztery ślady w swoim lokalnym repozytorium. Proces usuwania tych czterech śladów wynika z trzech poniższych poleceń:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

246
2018-03-02 16:07



Dlaczego ta odpowiedź ma tak mało awansów? Wszystkie te popularne odpowiedzi chybiają czegoś, to jedyny, który naprawdę usuwa wszystkie ślady submodułu, w najprostszy możliwy sposób. I uwaga: kolejność poleceń ma znaczenie. - mbdevpl
Aby odpowiedzieć na moje własne pytanie: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows - Thomas
@mbdevpl przyszedł 3 lata po zaakceptowanej odpowiedzi, i chyba nikt nie zdołał przekonać OP do zaakceptowania tego - Andy
@Tomasz rm -rf po prostu oznacza "usuń cały folder", dzięki czemu możesz to zrobić z GUI Explorera w Windows. Ewentualnie, jeśli używasz git w Windows, będziesz miał również dostępne git bash, więc możesz uruchomić wszystkie te polecenia tam i będą działać tak jak są - Andy Madge
TO jest nieskomplikowana odpowiedź w 2018 roku? - Warren P


Proste kroki

  1. Usuń wpisy konfiguracyjne:
    git config -f .git/config --remove-section submodule.$submodulename
      git config -f .gitmodules --remove-section submodule.$submodulename
  2. Usuń katalog z indeksu:
    git rm --cached $submodulepath
  3. Popełnić
  4. Usuń nieużywane pliki:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Proszę zanotować:  $submodulepath nie zawiera wiodących lub ukośnych ukośników.

tło

Kiedy to zrobisz git submodule add, tylko to dodaje .gitmodules, ale kiedy to zrobiłeś git submodule init, dodano do .git/config.

Jeśli chcesz usunąć moduły, ale możesz je szybko przywrócić, następnie wykonaj następujące czynności:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

To dobry pomysł git rebase HEAD pierwszy i git commit na końcu, jeśli umieścisz to w skrypcie.

Zobacz też odpowiedź na Czy mogę opróżnić moduł modułowy Git?.


185
2017-08-11 14:43



Miałem wiele submodułów (i większy bałagan), więc musiałem przejść przez pętlę for. Ponieważ większość z nich znajdowała się pod określonym katalogiem, a plik wyjściowy zawierał końcowe ukośniki. Zrobiłem coś takiego for dir in directory/*; do git rm --cached $dir; done. - Pablo Olmos de Aguilera C.
Aby uzyskać tę listę, która może być użyta w skrypcie do rekurencyjnego usuwania - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//' Wygląda na to, że musisz to zrobić na wypadek, gdyby coś się popsuło, inaczej nie git submodule | grep -v '^+' | cut -d' ' -f3 - errordeveloper
aby uzyskać listę modułów, w których nie wprowadzono żadnych zmian lokalnych - git submodule | grep '^+' | cut -d' ' -f2 - errordeveloper
Uwaga, musiałem uwzględnić submodulename w podwójnych cudzysłowach "submodulename" .. odnosząc się do .git/config plik - muon
# 2 było dokładnie tym, czego szukałem, dzięki! +1 - AyexeM


Oprócz zaleceń musiałem również rm -Rf .git/modules/path/to/submodule aby móc dodać nowy submoduł o tej samej nazwie (w moim przypadku zastępowałem widelec oryginałem)


80
2017-10-12 10:17



Miałem też z tym kłopoty. Jeśli spróbujesz ponownie zainstalować moduł podrzędny na tej samej ścieżce, informacje o gałęzi będą przechowywane w podanej lokalizacji, co jest przyczyną problemów. - jangosteve
Dzięki, też tego potrzebowałem. @Anton, zgadzam się i zredagowałem odpowiedź z góry, aby dodać te informacje. - William Denniss
Użyłem opcji --name, aby zastąpić pracę ... zobacz stackoverflow.com/questions/14404704/... - joseph.hainline


Musisz usunąć wpis w .gitmodules i .git/configi usuń katalog modułu z historii:

git rm --cached path/to/submodule

Jeśli napiszesz na liście adresowej git, prawdopodobnie ktoś zrobi dla Ciebie skrypt powłoki.


46
2017-11-01 21:43



Nie ma potrzeby stosowania żadnego skryptu powłoki, inna odpowiedź zawiera polecenia do usuwania wszystkich śladów modułu częściowego: stackoverflow.com/a/36593218/4973698 - mbdevpl


Aby usunąć dodany moduł dodatkowy za pomocą:

git submodule add blah@blah.com:repos/blah.git lib/blah

Biegać:

git rm lib/blah

to jest to!

W przypadku starszych wersji git (około ~ 1.8.5) użyj:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

45
2017-07-09 17:55



+1 rzeczywiście. Jest to jedyna prawidłowa odpowiedź z Git 1.8.3. Powinien być zaakceptowany jako właściwy. - Xananax
+1 Właściwy i czysty sposób na usunięcie w nowszych wersjach git. - Xiv
git rm nadal pozostawia rzeczy w .git/modules/. (2.5.4) - Rudolf Adamkovič
@RudolfAdamkovic to działa dla mnie? Zauważ, że usuwa on tylko moduł submodule, jeśli dokładnie pasuje ścieżka; jeśli przestawiłeś moduł częściowy, a następnie użyjesz git rm nie ma; Szybki test w wersji 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 / wersji, w której to nie nastąpi, prawdopodobnie powinieneś złożyć błąd na jej temat. - Doug
Ta odpowiedź nie jest całkowicie poprawna. git rm zostawia rzeczy .git/modules/ reż .git/config plik (ubuntu, git 2.7.4). Inne odpowiedzi działają w 100%: stackoverflow.com/a/36593218/4973698 - mbdevpl


Możesz użyć aliasu, aby zautomatyzować rozwiązania dostarczane przez innych:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Umieść to w swojej konfiguracji git, a następnie wykonaj: git rms path/to/submodule


40
2018-05-16 09:27





Podsumowując, oto co powinieneś zrobić:

  1. Zestaw path_to_submodule var (bez ukośnego ukośnika):

    path_to_submodule=path/to/submodule

  2. Usuń odpowiednią linię z pliku .gitmodules:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. Usuń odpowiednią sekcję z .git / config

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Unstage i usuń $ path_to_submodule tylko z indeksu (aby zapobiec utracie informacji)

    git rm --cached $path_to_submodule

  5. Śledź zmiany wprowadzone w .gitmodules

    git add .gitmodules

  6. Zatwierdź superprojekt

    git commit -m "Remove submodule submodule_name"

  7. Usuń teraz niepobrane pliki submodułów

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


38
2017-10-22 10:54



więc wszyscy, którzy wycofają moją zmianę, będą musieli uruchomić rm -rf $ path_to_submodule rm -rf .git / modules / $ path_to_submodule, aby usunąć pamięć podręczną modułu? - j2emanue
Polecam zaktualizować, git submodule update. A jeśli ścieżki podmodułów nie zostały poprawnie zaktualizowane (git zgłasza błąd), usuń je: rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update - luissquall