Mam podmoduł git (RestKit), który dodałem do mojego repozytorium.
Przypadkowo zmieniłem niektóre pliki i chciałbym wrócić do wersji źródłowej. Aby to zrobić, próbowałem uruchomić
Mac:app-ios user$ git submodule update RestKit
Ale jak widać tutaj, to nie działało, ponieważ nadal jest to „zmodyfikowana treść”:
Mac:app-ios user$ git status
...
# modified: RestKit (modified content)
Parzysty
Mac:app-ios user$ git submodule update -f RestKit
nie przywraca lokalnie zmodyfikowanych plików.
Jak zresetować zawartość tego podmodułu?
git
git-submodules
Eric
źródło
źródło
git reset --hard
nie działa, najpierw spróbuj określić gałąź zdalną za pomocągit reset --hard origin/<branch_name>
.Odpowiedzi:
Przejdź do katalogu submodułu, a następnie wykonaj
git reset --hard
reset, aby zresetować wszystkie zmodyfikowane pliki do ich ostatniego zatwierdzonego stanu. Pamiętaj, że spowoduje to odrzucenie wszystkich niezaangażowanych zmian.źródło
git submodule update --init
pracował dla mnie; bez--init
tego w ogóle nie działało.git submodule update -f --init
w moim przypadku.Jeśli chcesz to zrobić dla wszystkich podmodułów, bez konieczności zmiany katalogów, możesz wykonać
git submodule foreach git reset --hard
Możesz także użyć flagi rekurencyjnej, aby zastosować się do wszystkich podmodułów:
git submodule foreach --recursive git reset --hard
źródło
git submodule foreach --recursive git clean -x -f -d
Bardziej bezpieczna metoda niż wszystkie poprzednie odpowiedzi:
Pierwsze polecenie całkowicie „rozłącza” wszystkie podmoduły, drugie następnie dokonuje ich ponownego sprawdzenia.
Zajmuje to więcej czasu niż inne metody, ale działa niezależnie od stanu twoich submodułów.
źródło
error: Your local changes to the following files would be overwritten by checkout
*
w moimPS1
, żegit status -uno
nie był w stanie wytłumaczyć).Dobrze dla mnie
po prostu zresetuj submoduł do stanu, w którym się wypisał, nie jest to konieczne do zatwierdzenia / stanu repozytorium głównego. Nadal będę mieć „zmodyfikowane treści”, jak powiedział OP. Aby przywrócić submoduł do poprawnego zatwierdzenia, uruchamiam:
Kiedy to zrobię
git status
, w podmodule jest czysto.źródło
submodule update --init
zresztą nie przywraca lokalnych modyfikacji w moim przypadku: |wykonaj 4 kolejne kroki:
źródło
git submodule update
było tym, co naprawiło(new commits)
dla mnie.To działało dla mnie, włączając rekurencyjnie w submoduły (być może dlatego twój -f nie działał, ponieważ zmieniłeś submoduł wewnątrz tego modułu):
źródło
Najpierw spróbuj tego, jak powiedzieli inni:
Jeśli to nie zadziała, przejdź do katalogu submodułu i użyj następującego polecenia, aby sprawdzić, czy w tym module są jakieś zmiany:
Jeśli są zmiany w twoim module podrzędnym, pozbądź się ich. Sprawdź, czy nie widzisz żadnych zmian po uruchomieniu „git status”.
Następnie wróć do głównego repozytorium i ponownie uruchom „git submodule update --init”.
źródło
Od wersji Git 2.14 (III kwartał 2017 r.) Nie trzeba wchodzić do każdego podmodułu, aby wykonać
git reset
(jak wgit submodule foreach git reset --hard
)Jest tak, ponieważ sam git reset wie teraz, jak rekurencyjnie wchodzić w podmoduły.
Zobacz zatwierdzenie 35b96d1 (21 kwietnia 2017 r.) I zatwierdzenie f2d4899 , zatwierdzenie 823bab0 , zatwierdzenie cd279e2 (18 kwietnia 2017 r.) Przez Stefan Beller (
stefanbeller
) .(Połączone przez Junio C Hamano -
gitster
- w commit 5f074ca , 29 maja 2017 r.)git-reset
jest kolejnym działającym manipulatorem drzewa, którego należy uczyć o submodułach.Ostrzeżenie : różnica między:
git reset --hard --recurse-submodule
igit submodule foreach git reset --hard
polega na tym, że ten pierwszy zresetuje również główne drzewo robocze repozytorium nadrzędnego, ponieważ ten drugi zresetuje tylko drzewo robocze podmodułów.
Więc używaj ostrożnie.
źródło
W przypadku git <= 2.13 te dwa polecenia łącznie powinny zresetować repozytorium za pomocą rekurencyjnych submodułów:
źródło
Działa to z naszymi bibliotekami z GIT v1.7.1, w których mamy repozytorium pakietów DEV i repozytorium pakietów LIVE. Same repozytoria są niczym innym jak powłoką do pakowania zasobów dla projektu. wszystkie podmoduły.
NA ŻYWO nigdy nie jest celowo aktualizowana, jednak pliki pamięci podręcznej lub wypadki mogą wystąpić, pozostawiając repozytorię brudną. Nowe submoduły dodane do DEV muszą zostać zainicjowane również w LIVE.
Repozytorium paczek w DEV
W tym miejscu chcemy usunąć wszystkie zmiany, o których jeszcze nie wiemy, a następnie zaktualizujemy nasze repozytorium pakietów.
Repozytorium paczek w LIVE
W tym miejscu chcemy wyciągnąć zmiany, które są zatwierdzone w repozytorium DEV, ale nie nieznane zmiany w górę.
źródło
Jeśli chcesz odrzucić wszystkie zmiany w całym repozytorium wraz z podmodułami, możesz użyć
git restore . --recurse-submodules
Spowoduje to cofnięcie wszystkich zmian dokonanych w repozytorium i podmodułach.
źródło
mój sposób na zresetowanie wszystkich podmodułów (BEZ odłączania i utrzymywania ich gałęzi „master”):
git submodule foreach 'git checkout master && git reset --hard $ sha1'
źródło