Jak usunąć подмодуль?

Jak usunąć подмодуль Git?

tak przy okazji, dlaczego nie mogę po prostu zrobić git submodule rm whatever ?


git1.8.3 (22 kwietnia 2013):

nie ma porcelana sposób, aby powiedzieć "nie jestem już zainteresowany tym подмодуле", po tym, jak wyrazić swoje zainteresowanie w подмодуле z "submodule init".
"submodule deinit " to jest sposób, aby to zrobić.

proces usuwania jest również używany git rm (od git1.8.5 października 2013 roku).

cv

proces usuwania 3-steps wtedy bądź:

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: to jest wymienione w Daniel Schroeder ' s odpowiedź, i zestawiono Eonilkomentarze:

pozostawia .git/modules/<path-to-submodule>/ bez zmian.
Dlatego, jeśli kiedyś usuniesz подмодуль za pomocą tej metody i ponownie dodać je, to będzie niemożliwe, bo to repozytorium jest już uszkodzony.


git rm: Patrz!--69-->popełnić 95c16418:

obecnie używany "git rm " w подмодуле usuwa drzewo pracy подмодуля z drewna суперпроекта i gitlink z indeksu.
Ale sekcja подмодуля w .gitmodules pozostaje nienaruszona, co jest pozostałością teraz zdalnego подмодуля i może drażnić użytkowników (w przeciwieństwie do ustawienia w .git/config, to musi pozostać jako przypomnienie o tym, że użytkownik wyraził zainteresowanie tym субмодуль tak będzie zamieszkana później, gdy będzie stara sprawdzona blokada).

niech "git rm "pomoc użytkownikowi nie tylko usunąć подмодуль z pracy drewna, ale również usunąć"submodule.<submodule name> sekcja" Od i oba.


git submodule deinit: jest to związane z ten patch:

"git submodule init" użytkownik może sprawdzić git, że dbają o jednym lub kilku подмодулях i chcą, aby był on wypełniony przy następnym wywołaniu "git submodule update".
Ale obecnie nie ma prostego sposobu, aby powiedzieć git, że oni nie dbają o подмодуле i chcą pozbyć się lokalnego drewna pracy (jeśli użytkownik nie wie wiele o wewnętrznych elementach подмодуля i nie usuwa "submodule.$name.url" zainstaluj z .git/config razem z samym drzewem pracy).

pomóż tym użytkownikom, dając"deinit'.
To usuwa wszystkie .git/config z uwzględnieniem подмодуль(y) (lub dla wszystkich tych, które zostały zainicjowane, jeśli'.' stosowany).
Zawiesza się, jeżeli aktualna drzewo pracy zawiera zmiany, jeśli nie wymusza.
Narzekaj, gdy подмодуля, określonego w wierszu polecenia, parametr adresu url nie można znaleźć w .git/config, ale jednak nie zawiedźcie.

to wychodzi, jeśli kroki inicjalizacji (de) (.git/config a .git/modules/xxx)

od git1.8.5,git rm akceptuje a pielęgnacja:

  • 'add' krok, który rejestruje adres url подмодуля w .gitmodules plik: to trzeba odinstalować dla ciebie.
  • подмодуль specjalny wpis (co potwierdzają pytanie): git rm usuwa go z indeksu:
    git rm --cached path_to_submodule (bez Ukośnika)
    To usunie ten katalog jest przechowywany w indeksie ze specjalnym trybem "160000", oznaczając go jako głównym katalogu подмодуля.

jeśli zapomnisz ten ostatni krok i spróbować dodać to, co było подмодулем jako zwykły katalog, otrzymasz komunikat o błędzie:

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

Uwaga: począwszy od Git 2.17 (Q2 2018), git submodule deinit nie jest skryptem powłoki.
To wywołanie funkcji C.

zobacz popełnić 2e61273,popełnić 1342476 (14 stycznia 2018) by Prathamesh Чаван (pratham-pc).
(слитый Junio C Hamano -- gitster --popełnić ead8dbe, 13 lutego 2018)

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

na stronie Git Подмодуль Poradnik:

aby usunąć подмодуль, trzeba:

  1. usuń odpowiedni rozdział z .
  2. etap .gitmodules zmiany git add .gitmodules
  3. usuń odpowiedni rozdział z .git/config.
  4. uruchom git rm --cached path_to_submodule (bez Ukośnika).
  5. uruchom rm -rf .git/modules/path_to_submodule
  6. Commit git commit -m "Removed submodule <name>"
  7. usuń teraz untracked pliki подмодуля
    rm -rf path_to_submodule

zobacz też:alternatywne środki, poniżej.


po prostu do wiadomości. Od git 1.8.5.2, dwie drużyny będą robić:

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

jak prawidłowo wskazał odpowiedź @Mark Cheverton, jeśli druga linia nie jest używany, nawet jeśli usunięte подмодуль w tej chwili, resztę .folder git/modules/the_submodule zapobiega dodanie lub zastąpienie jednego i tego samego подмодуля w przyszłości. Ponadto, jak wspomniał @VonC,git rm będzie wykonywać większość pracy na подмодуле.

--Update (07/05/2017)--

po prostu dla wyjaśnienia, the_submodule - ścieżka względna подмодуля wewnątrz projektu. Na przykład,subdir/my_submodule jeśli подмодуль znajduje się wewnątrz podkatalogu subdir.

jak poprawnie określono w komentarzach i inne odpowiedzi, dwie drużyny (choć funkcjonalnie są wystarczające, aby usunąć подмодуля) zostawiają ślad w .git/config (według stanu na lipiec 2017 r.), który może być usunięty za pomocą trzeciej drużyny:

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

większość odpowiedzi na to pytanie są nieaktualne, niekompletne lub niepotrzebnie skomplikowane.

подмодуль, sklonowany za pomocą git 1.7.8 lub nowszy, zostawia czterech śladów w lokalnym REPO. Proces usuwania tych czterech śladów określa trzema drużynami poniżej:

# 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

proste kroki

  1. usuń wpisy config:
    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. Commit
  4. usuń nieużywane pliki:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

uwaga: $submodulepath nie zawiera początkowe lub końcowe ukośniki.

tło

kiedy git submodule add to tylko dodaje go w .gitmodules, ale kiedyś to zrobiłeś git submodule init i dodał .git/config.

dlatego, jeśli chcesz usunąć moduły, ale można szybko przywrócić go, następnie zrobić tylko to:

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

to jest dobry pomysł, aby zrobić git rebase HEAD pierwszy git commit w końcu, jeśli umieścić to w scenariusz.

Zobacz też odpowiedź czy mogę anulować wypełnienie подмодуля Git?.


W dodatku do zaleceń, musiałem rm -Rf .git/modules/path/to/submodule, aby móc dodać nowy подмодуль o tej samej nazwie (w moim przypadku zastępował wtyczkę na oryginał)


musisz usunąć wpis w .gitmodules a .git/config i usuń katalog modułu z historii:

git rm --cached path/to/submodule

Jeśli napiszesz w liście dyskusyjnej git, chyba, że ktoś zrobi dla ciebie skrypt powłoki.


aby usunąć подмодуль dodany za pomocą:

git submodule add [email protected]:repos/blah.git lib/blah

Run:

git rm lib/blah

dokładnie.

dla 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

można użyć aliasu do automatyzacji decyzji od innych:

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

umieść to w konfiguracji git, a następnie można zrobić: git rms path/to/submodule


podsumowując, to co należy zrobić :

  1. Set path_to_submodule var (bez ukośnika):

    path_to_submodule=path/to/submodule

  2. usuń odpowiedni wiersz .gitmodules plik:

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

  3. usuń odpowiedni klucz .git / config

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

  4. Unstage i usunąć $path_to_submodule tylko z indeksu (aby zapobiec utracie informacje)

    git rm --cached $path_to_submodule

  5. śledzenie zmian .gitmodules

    git add .gitmodules

  6. zablokować суперпроект

    git commit -m "Remove submodule submodule_name"

  7. usuń pliki подмодуля, które teraz nie są śledzone

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


jeśli подмодуль losowo dodano, bo dodał, wykryły i kliknięciu folderu, który został już repozytorium Git (contained .git), nie będzie .gitmodules plik do edycji lub coś w .git/config. w tym przypadku wszystko, co musisz to :

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW ja również usunięte


po eksperymentach z różnymi odpowiedziami na tej stronie, skończyłem z tym rozwiązaniem:

#!/bin/sh
path=""
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

to przywraca taki sam stan, co do dodawania подмодуля. Możesz od razu dodać подмодуль ponownie, że nie można było z większością odpowiedzi tutaj.

git submodule add $giturl test
aboveScript test

To pozostawia czystą próbnego bez żadnych zmian do zatwierdzenia.

To było testowane z:

$ git --version
git version 1.9.3 (Apple Git-50)

co ja teraz robię Dec 2012 (łączy większość z tych odpowiedzi):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"

znalazłem deinit działa dobrze dla mnie:

git submodule deinit <submodule-name>    
git rm <submodule-name>

git docs:

deinit

anulować rejestrację danych подмодулей, czyli usunąć wszystkie submodule.$name sekcja S. git / config wraz ze swoim drzewem pracy.


niedawno dowiedziałem się projekt git, który zawiera wiele przydatnych poleceń związanych z git: https://github.com/visionmedia/git-extras

zaznacz go i wpisz:

git-delete-submodule submodule

to wszystko jest zrobione. Katalog подмодулей zostanie usunięty z twojego REPO i nadal istnieje w twoim systemie. Następnie można odnotować zmianę, np.:git commit -am "Remove the submodule".


oto co zrobiłem :

1.) Wykluczyć odpowiedniej sekcji .plik gitmodules. Możesz użyć polecenia poniżej:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) Etap .gitmodules zmiany

git add .gitmodules

3. Usunąć odpowiedni rozdział z .git/config. Możesz użyć polecenia poniżej:

git submodule deinit -f "submodule_name"

4.) Usuń gitlink (bez ukośnika):

git rm --cached path_to_submodule

5.) Czyszczenie .git/modules:

rm -rf .git/modules/path_to_submodule

6.) Dokonują:

git commit -m "Removed submodule <name>"

7. Usunąć pliki подмодуля, które teraz nie są śledzone

rm -rf path_to_submodule

musiałem podjąć działania John Douthat jeden krok dalej i cd w katalogu подмодуля, a następnie usunąć repozytorium Git:

cd submodule
rm -fr .git

wtedy mógłbym zablokować pliki jako część nadrzędnego repozytorium Git bez starej linki do подмодуль.


project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force

właśnie znalazłem .подмодуль (zapomniałem dokładnej nazwy) plik ukryty, ma listę... możesz usunąć je pojedynczo, że drogę. U mnie był tylko jeden, więc go usunąłem. Po prostu, ale to może zepsuć Git, tak jak ja nie wiem czy wynika coś z подмодулем. Na razie wszystko jest w porządku, oprócz zwykłej problemy z aktualizacją libetpan, ale to (mam nadzieję) nie wynika.

zauważyłem, że nikt nie opublikował ręczne kasowanie, więc dodał


oto 4 kroki, które znalazłem, niezbędne lub przydatne (najpierw ważne):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

w teorii,git rmKrok 1: powinien się tym zająć. Mam nadzieję, że na drugą część pytania OP będzie można pozytywnie odpowiedzieć w jeden dzień (że można to zrobić za pomocą jednego polecenia).

ale według stanu na lipiec 2017 r.,Krok 2: należy usunąć dane w .git/modules/ w przeciwnym razie, nie można, na przykład, dodać подмодуль w przyszłości.

pewnie, że można uciec z dwoma powyższymi krokami do git 1.8.5+ as tinlyx to zauważył, jak wszystkie git submodule polecenia wydaje się, pracują.

Krok 3 usuwa sekcję the_submodule w pliku .git/config. Należy to zrobić dla kompletności. (Zapis może powodować problemy dla starszych wersji git, ale nie mam jednego do testowania).

dla tego, większość odpowiedzi zalecamy używanie git submodule deinit. Uważam, że to bardziej wyraźne i mniej kłopotliwe w użyciu git config -f .git/config --remove-section. Zgodnie z dokumentacja git submodule,git deinit:

anulować rejestrację danych подмодулей ... Jeśli naprawdę chcesz usunąć подмодуль z repozytorium i trwałość, które korzystają z git-rm[1] zamiast.

ostatni, ale nie najmniej, jeśli nie git commit / można uzyskać błąd podczas wykonywania git submodule summary (według stanu na git 2.7):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

to niezależnie od tego, czy robicie kroki 2 i 3.


Jeśli tylko dodaje подмодуль, i, na przykład, można po prostu dodać niewłaściwy подмодуль lub dodasz go w niewłaściwym miejscu, po prostu zrób git stash następnie usuń folder. To sugeruje, że dodawanie подмодуля-jedyne, co zrobiłeś w ostatnim REPO.