Jaki jest obecny sposób usuwania podmodułu git?

91

od wersji 1.9.3 git (Apple Git-50) na Macu, jak usunąć moduł podrzędny git? Czytam wiele nieaktualnych informacji, a wielu programistów mówi mi, że nie będą działać. Jaki jest obecny sposób? będzie git deinit pathToSubModule rade?

Kroki, które według mnie zadziałają, są tutaj, ale komentarze mówią, że nie.

Pozwólcie, że wyjaśnię moją obecną sytuację i to, co muszę osiągnąć. Zainstalowałem repozytorium Quick i dodałem je jako podmoduł do mojego projektu. Ten kod jest już zarejestrowany i inni go używają. To, co teraz muszę zrobić, to rozwidlić to samo repozytorium Quick i umieścić je na bezpieczniejszym githubie, który ma moja firma (czyli zupełnie inny prywatny github). Po rozwidleniu chcę dodać ten fork jako gitSubmodule i pozwolić mu zastąpić obecny moduł Quick, który zainstalowałem wcześniej.

aktualizacja: przeczytałem, że poniższy sposób jest prawidłowy w najnowszej wersji git, proszę potwierdzić?

To remove a submodule added using:

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

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
j2emanue
źródło
Zmagałem się z problemami z submodułami przez dwa dni. 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 rozszerzaniem adresów URL zawierających znak „~”. Gdy zmieniłem ssh: //[email protected]/~/git/MyRepo.git na ssh: //[email protected]/home/username/git/MyRepo.git (sprawdź rzeczywistą ścieżkę na twoim serwerze), cała dziwność zniknęła po dziesięciu minutach.
Elise van Looij

Odpowiedzi:

193

Masz git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Wyrejestruj dane podmoduły, czyli usuń całośćsubmodule.$name
sekcję .git/configwraz z ich drzewem roboczym.

Kolejne wywołania git submodule update, git submodule foreachi git submodule syncbędzie pominąć żadnych niezarejestrowanych submodules dopóki nie zostaną ponownie zainicjowany, więc użyć tego polecenia, jeśli nie chcą mieć lokalną kasę z modułem w drzewie już pracować.

Jeśli naprawdę chcesz usunąć moduł podrzędny z repozytorium i zatwierdzić to użycie git rm .

Jeśli --forcezostanie określony, drzewo robocze modułu podrzędnego zostanie usunięte, nawet jeśli zawiera lokalne modyfikacje.

CodeWizard
źródło
8
chcę całkowicie usunąć moduł podrzędny dla siebie i innych użytkowników. Więc potrzebuję tylko git submodule deinit asubmodule; i git rm asubmodule? A co z podmodułem innych użytkowników zapisanym w pamięci podręcznej, czy musieliby go usunąć po ściągnięciu?
j2emanue
1
Chciałem usunąć lokalną kopię podmodułu i to działało idealnie, wszystkie pliki w podkatalogu zniknęły.
malhal
1
Może być również potrzebny, rm -rf <asubmodule>jeśli już sprawdziłeś wersję repozytorium podstawowego, które wyrejestrowało moduł podrzędny.
Sarah Messer
6

Używam Git w wersji 2.16.2 i git rmprzeważnie dobrze sobie radzę :

git rm path-to-submodule

Możesz sprawdzić za pomocą git statusi, git diff --cachedże spowoduje to deinicjalizację modułu podrzędnego i .gitmodulesautomatyczną modyfikację . Jak zawsze, musisz zatwierdzić zmianę.

Jednak nawet jeśli moduł podrzędny został usunięty z kontroli źródła, .git/modules/path-to-submodulenadal zawiera repozytorium modułu podrzędnego i .git/configzawiera jego adres URL, więc nadal musisz usunąć je ręcznie:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

Zachowanie repozytorium i konfiguracji podmodułów jest celowe, aby można było cofnąć usunięcie za pomocą np git reset --hard.

mrts
źródło
1
najnowsza odpowiedź i najkrótsze rozwiązanie
TurboGuma
3

Jak bezpiecznie usunąć podmoduł.

(dodaje do https://stackoverflow.com/a/1260982/342794 )

  1. Wyświetl i zlokalizuj sekcję modułu podrzędnego w .gitmodulespliku. Powiedz przez terminal vi .gitmodules. Przykład:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. Podmoduły mogą być używane z lokalnymi widełkami. W przypadku długotrwałych projektów kod może różnić się od oryginalnego repozytorium i może zawierać pewne poprawki. Warto sprawdzić, czy kod modułu podrzędnego przeszedł zmiany w trakcie projektu. Przykład: spójrz na dzienniki, jeśli wskazują na masteroddział lub oddział lokalny. przeglądanie dzienników git w celu znalezienia modyfikacji wprowadzonych za pośrednictwem terminala. zazwyczaj są one przechowywane w katalogu, na przykład w submoduleskatalogu.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Usuń sekcję submodułu z .gitmodules, zapisz plik. Przykład: git statuspowinien wyświetlać tylko następujące po zmodyfikowaniu

    modified:   .gitmodules
    
  4. Ustaw zmiany za pomocą git add .gitmodules.

  5. Wyświetl i zlokalizuj sekcję modułu podrzędnego w .git/configplikach. Powiedz przez terminal vi .git/config. Przykład:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Usuń pliki sobmodule cache git. uruchomienie git rm --cached submodules/afnetworking(bez końcowego ukośnika) usunie go pomyślnie. Przykład:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Usuń pliki podmodułów w .gitkatalogu za pomocą rm -rf .git/modules/.... Potwierdź to git statuspóźniej.

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. Zatwierdź zmiany. git statusNastępnie potwierdź za pomocą .

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. Usuń nieśledzone pliki modułów podrzędnych.

    User$ rm -rf submodules/afnetworking
    
  10. Usuń odniesienia z projektu Xcode. Twórz, naprawiaj problemy z kompilacją i uruchomieniem.

lal
źródło