Mam projekt z podmodułem, który wskazuje na niepoprawne zatwierdzenie: zatwierdzenie podmodułu pozostało lokalne i kiedy próbuję pobrać go z innego repozytorium, otrzymuję:
$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'
Wiem co HEAD modułem powinno być, czy jest jakiś sposób mogę zmienić lokalnie, bez pchania z repo, że robi się popełnić 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
?
Nie jestem pewien, czy wszystko jest jasne ... oto podobna sytuacja, którą znalazłem.
git
git-submodules
Mauricio Scheffer
źródło
źródło
Odpowiedzi:
Zakładając, że repozytorium submodułu zawiera zatwierdzenie, którego chcesz użyć (w przeciwieństwie do zatwierdzenia, do którego odwołuje się bieżący stan superprojektu), istnieją dwa sposoby, aby to zrobić.
Pierwszy wymaga znajomości zatwierdzenia z podmodułu, którego chcesz użyć. Działa od „wewnątrz, na zewnątrz”, bezpośrednio dostosowując submoduł, a następnie aktualizując superprojekt. Drugi działa od „z zewnątrz”, znajdując zatwierdzenie super projektu, które zmodyfikowało podmoduł, a następnie resetuj indeks superprojektu, aby odnosił się do innego zatwierdzenia submodułu.
Na lewą stronę
Jeśli już wiesz, jakiego zatwierdzenia chcesz użyć
cd
w tym podmodule, sprawdź w tym podmenu, którego chcesz, a następniegit add
igit commit
ponownie w super-projekcie.Przykład:
Ups, ktoś wykonał zatwierdzenie super projektu, które odnosi się do niepublikowanego zatwierdzenia w podmodule
sub
. Jakoś wiemy już, że chcemy, aby podmoduł był na zatwierdzeniu5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Idź tam i sprawdź to bezpośrednio.Kasa w podmodule
Ponieważ sprawdzamy zatwierdzenie, powoduje to odłączenie HEAD w submodule. Jeśli chcesz się upewnić, że submoduł używa gałęzi, użyj
git checkout -b newbranch <commit>
do utworzenia i pobrania gałęzi przy zatwierdzeniu lub wypłaty żądanej gałęzi (np. Takiej z żądanym zatwierdzeniem na końcu).Zaktualizuj superprojekt
Kasa w podmodule znajduje odzwierciedlenie w superprojekcie jako zmiana w działającym drzewie. Musimy więc wprowadzić zmiany w indeksie superprojektu i zweryfikować wyniki.
Sprawdź wyniki
Aktualizacja submodułu była cicha, ponieważ submoduł jest już w określonym zatwierdzeniu. Pierwszy diff pokazuje, że indeks i drzewo robocze są takie same. Trzeci diff pokazuje, że jedyną zmianą etapową jest przeniesienie
sub
submodułu do innego zatwierdzenia.Popełnić
Zatwierdza to pozycję submodułu naprawionego.
Na zewnątrz, w
Jeśli nie jesteś pewien, którego zatwierdzenia powinieneś użyć z podmodułu, możesz przejrzeć historię w superprojekcie, aby cię poprowadzić. Możesz także zarządzać resetowaniem bezpośrednio z superprojektu.
To ta sama sytuacja, co powyżej. Ale tym razem skupimy się na naprawieniu go z superprojektu zamiast zanurzaniu się w submodule.
Znajdź błędne zobowiązanie superprojektu
OK, wygląda na to, że poszło źle
ce5d37c
, więc przywrócimy submoduł z jego elementu nadrzędnego (ce5d37c~
).Alternatywnie możesz pobrać zatwierdzenie podmodułu z tekstu poprawki (
5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) i zamiast tego użyć powyższego procesu „wewnątrz, na zewnątrz”.Zamówienie w Super-projekcie
Spowoduje to zresetowanie wpisu podmodułu
sub
do tego, co było w zatwierdzeniuce5d37c~
w superprojekcie.Zaktualizuj podmoduł
Aktualizacja podmodułu poszła OK (wskazuje na odłączoną GŁOWĘ).
Sprawdź wyniki
Pierwszy diff pokazuje, że
sub
jest teraz taki sam wce5d37c~
. Drugi plik różnic pokazuje, że indeks i drzewo robocze są takie same. Trzeci diff pokazuje, że jedyną zmianą etapową jest przeniesieniesub
submodułu do innego zatwierdzenia.Popełnić
Zatwierdza to pozycję submodułu naprawionego.
źródło
e47c0a
zatwierdzenie, które nie istnieje w lokalnym repozytoriumsub
, alesub
punkty super-projektu wskazują na to zatwierdzenie. Może się tak zdarzyć, ponieważ ktoś inny utworzyłe47c0a
w swojej kopiisub
, zaktualizował swój superprojekt, aby wskazywał na to zatwierdzenie, i wypchnął superprojekt, nie pchające47c0a
do centralnego / wspólnego repozytoriumsub
. Kiedy ciągnąć od centralnego / wspólną super projektu otrzymujemy zobowiązują się, że punktysub
doe47c0a
, ale nie możemy „zobaczyć”, które popełnił.ce5d37c
jest podejrzany, ponieważ w oparciu o różnicę wprowadziłe47c0a
.sub
przechowywany w repozytorium nadrzędnym, który ma go jako podmoduł, i czy można nim manipulować bezpośrednio do bieżącego HEADsub
bezpośrednio, bez polegania na starszym stanie rodzica repo, co nie zawsze może pomóc.Spróbuj tego:
źródło
git submodule sync
jest konieczne w scenariuszach, w których zmienił się adres URL pilota dla danego podmodułu. W naszym przypadku dodaliśmy nasz podmoduł z publicznego repozytorium, a następnie zmieniliśmy adres URL na prywatny widelec - i znaleźliśmy się w tym konkretnym pikle.Ten błąd może oznaczać brak zatwierdzenia w podmodule. Oznacza to, że repozytorium (A) ma podmoduł (B). A chce załadować B, aby wskazywał na pewne zatwierdzenie (w B). Jeśli tego zatwierdzenia w jakiś sposób brakuje, pojawi się ten błąd. Kiedyś możliwa przyczyna: odwołanie do zatwierdzenia zostało wypchnięte w A, ale rzeczywiste zatwierdzenie nie zostało wypchnięte z B. Więc zacznę od tego.
Mniej prawdopodobne, że występuje problem z uprawnieniami i nie można wyciągnąć zatwierdzenia (możliwe, jeśli używasz git + ssh).
Upewnij się, że ścieżki submodułów wyglądają dobrze w .git / config i .gitmodules.
Ostatnią rzeczą do wypróbowania - w katalogu podmodułu: git reset HEAD --hard
źródło
Możliwa przyczyna
Może się to zdarzyć, gdy:
np. stało się coś takiego:
W tym momencie powinien był być podmoduł.
W wyniku tego użytkownik zdalny nie mógł znaleźć brakujących zatwierdzeń, ponieważ nadal znajdują się one na dysku lokalnym.
Rozwiązanie
Poinformuj osobę, która zmodyfikowała podmoduł w celu wypchnięcia, tj
źródło
Wystąpił ten błąd, gdy:
ale zatwierdzenie w projekcie nadrzędnym wskazywało na wcześniejsze zatwierdzenie.
Usuwanie folderu submodułu i uruchamianie:
NIE rozwiązało problemu. Usunąłem repozytorium i spróbowałem ponownie bez flagi głębokości i zadziałało.
Ten błąd występuje w Ubuntu 16.04 git 2.7.4, ale nie w Ubuntu 18.04 git 2.17, TODO znajduje dokładne ustalenie zatwierdzenia lub wersji.
źródło
username/repo#sha
do package.json, o wiele bardziej elastyczną opcją jest zorganizowanie systemu za pomocą zestawu kontenerów dokerów--depth=1
oszczędza tak dużo przepustowości, gdy nie potrzebuję historii repo. Jeśli ktoś kiedykolwiek znajdzie lub wie, dlaczego tak się dzieje, chciałbym wiedzieć.deinit
podejście, które rozwiązuje problem przez większość czasu. W pakiecie z systemem kompilacji użytkownik końcowy może po prostu pozwolić systemowi kompilacji pobrać moduły podrzędne irecursive
porzucić całkowicie niedziałające polecenie. Nadal istnieją scenariusze, w których to się psuje, takie jak podmoduł, który naciskał na siłę i całkowicie kasował zatwierdzenie.Może się to również zdarzyć, gdy podmoduł wskazuje repozytorium, które zostało ponownie bazowane, a dane zatwierdzenie „zniknęło”. Chociaż zatwierdzenie może nadal znajdować się w zdalnym repozytorium, nie znajduje się w gałęzi. Jeśli nie możesz utworzyć nowej gałęzi (np. Nie swojego repozytorium), utkniesz w potrzebie aktualizacji super projektu, aby wskazywał na nowe zatwierdzenie. Alternatywnie możesz przesunąć jedną ze swoich kopii podmodułów w inne miejsce, a następnie zaktualizować superprojekt, tak aby wskazywał na to repozytorium.
źródło
Twój oddział może nie być aktualny, proste rozwiązanie, ale spróbuj
git fetch
źródło
Ta odpowiedź jest dla użytkowników SourceTree z ograniczonym doświadczeniem git terminalowym.
Otwórz problematyczny submoduł z projektu Git (superprojekt).
Pobierz i upewnij się, że „Pobierz wszystkie tagi” jest zaznaczone.
Rebase wyciągnij swój projekt Git.
To rozwiąże problem „odniesienie nie jest drzewem” 9 na dziesięć razy. To, że 1 raz tego nie zrobi, jest naprawą terminala, jak opisano w górnej odpowiedzi.
źródło
W każdym razie historia twojego submodułu jest bezpiecznie zachowana w git submodulu.
Dlaczego więc nie usunąć submodułu i dodać go ponownie?
W przeciwnym razie Próbowałeś ręcznie edytując
HEAD
lubrefs/master/head
wewnątrz modułem.git
źródło
Dla pewności spróbuj zaktualizować swoje
git
pliki binarne.GitHub dla Windows ma wersję,
git version 1.8.4.msysgit.0
która w moim przypadku była problemem. Aktualizacja rozwiązała to.źródło
W moim przypadku żadna z powyższych odpowiedzi nie rozwiązuje problemu, nawet jeśli są to dobre odpowiedzi. Więc zamieszczam swoje rozwiązanie (w moim przypadku są dwa klienty git, klient A i B):
przejdź do katalogu submodułu:
kasa do opanowania:
bazować na kodzie zatwierdzenia, który obaj klient widzi
wróć do katalogu rodzica:
zobowiązać się do opanowania
zmień na drugiego klienta, zrób to
rebase
ponownie.w końcu teraz działa dobrze! Może stracę kilka zobowiązań, ale działa.
Do Twojej wiadomości, nie próbuj usuwać swojego submodułu, pozostanie on
.git/modules
tam i nie będzie mógł odczytać tego submodułu ponownie, chyba że będzie reaktywny lokalny.źródło
Aby zsynchronizować repozytorium git z głową submodułu, w przypadku, gdy naprawdę tego chcesz, odkryłem, że usunięcie tego modułu, a następnie jego odczytanie pozwala uniknąć majstrowania przy historii. Niestety usunięcie submodułu wymaga hakowania, a nie pojedynczego polecenia git, ale wykonalne.
Kroki, które wykonałem, aby usunąć submoduł, zainspirowany https://gist.github.com/kyleturner/1563153 :
Ponownie, może to być przydatne, jeśli wszystko, czego chcesz, to ponownie wskazać głowę submodułu, a nie skomplikowałeś rzeczy, ponieważ musisz zachować lokalną kopię tego modułu. Zakłada się, że podmoduł ma „prawo” jako własne repozytorium, niezależnie od tego, skąd pochodzi, i po prostu chcesz wrócić do prawidłowego włączenia go jako submodułu.
Uwaga: zawsze wykonuj pełną kopię projektu przed przystąpieniem do tego rodzaju manipulacji lub jakiegokolwiek polecenia git poza zwykłym zatwierdzaniem lub wypychaniem. Radzę to również przy wszystkich innych odpowiedziach i jako ogólna wskazówka git.
źródło
Natknąłem się na ten problem i żadne z tych rozwiązań nie działało dla mnie. To, co okazało się rozwiązaniem mojego problemu, jest w rzeczywistości o wiele prostsze: uaktualnij Git. Mój był w wersji 1.7.1, a po uaktualnieniu go do wersji 2.16.1 (najnowszej) problem zniknął bez śladu! Chyba zostawiam to tutaj, mam nadzieję, że to komuś pomoże.
źródło