Błąd Git submodule head 'reference is not a tree'

Mam projekt z podmodułem, który wskazuje na nieprawidłowy commit: podmoduł commit pozostał lokalny i kiedy próbuję pobrać go z innego repo dostaję:

$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'

Wiem, jaka powinna być Głowica podmodułu, czy jest jakiś sposób, aby zmienić to lokalnie, bez naciskania z repo, że czy ma commit 2d7cfbd09fc96c04c4c41148d44ed7778add6b43?

Nie wiem, czy wyrażam się jasno... Oto podobna sytuacja znalazłem.
Author: mikemaccana, 2010-01-28

13 answers

Zakładając, że repozytorium podmodułu zawiera commit, którego chcesz użyć (w przeciwieństwie do commita, do którego odwołuje się aktualny stan super-projektu), są dwa sposoby, aby to zrobić.

Pierwszy wymaga, abyś znał commit z podmodułu, którego chcesz użyć. Działa od "wewnątrz, Na Zewnątrz", bezpośrednio dostosowując podmoduł, a następnie aktualizując super-projekt. Drugi działa z "zewnątrz, w", znajdując commit super-projektu, który zmodyfikował podmodule, a następnie Resetowanie indeksu super-projektu, aby odnosić się do innego podmodułu commit.

Wewnątrz, Na Zewnątrz

Jeśli już wiesz, który commit chcesz użyć, cd do podmodułu, sprawdź commit, który chcesz, a następnie git add i git commit z powrotem w super-projekcie.

Przykład:

$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'

UPS, ktoś zrobił commit super-projektu, który odnosi się do niepublikowanego commita w podmodule sub. Jakoś już wiemy, że chcemy submodule być w commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c. Idź tam i sprawdź to bezpośrednio.

Checkout w Podmodule

$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..

Ponieważ sprawdzamy commit, powoduje to oderwanie głowy w podmodule. Jeśli chcesz się upewnić, że podmodule używa gałęzi, użyj git checkout -b newbranch <commit>, aby utworzyć i wypisać gałąź przy zatwierdzeniu lub wypisać gałąź, którą chcesz (np. z żądanym zatwierdzeniem na końcu).

Update the Super-project

Kasa w podmoduł jest odzwierciedlony w super-projekcie jako zmiana drzewa roboczego. Musimy więc wprowadzić zmiany w indeksie super-projektu i zweryfikować wyniki.

$ git add sub

Sprawdź wyniki

$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c

Aktualizacja podmodułu była cicha, ponieważ podmoduł jest już w podanym commicie. Pierwsze rozróżnienie pokazuje, że indeks i obszar roboczy są takie same. Trzeci diff pokazuje, że jedyną wprowadzoną zmianą jest przeniesienie podmodułu sub do innego / align = "left" /

Commit

git commit

Oznacza to wpis stałej submodule.


Na Zewnątrz, W

Jeśli nie jesteś pewien, którego commita powinieneś użyć z podmodułu, możesz przejrzeć historię w superprojekcie, aby cię poprowadzić. Możesz również zarządzać resetem bezpośrednio z super-projektu.

$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'

Jest to taka sama sytuacja jak powyżej. Ale tym razem skupimy się na naprawieniu go z super-projektu zamiast zanurzać się w submodule.

[[38]}Znajdź błędny Commit Super-projektu
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c

OK, wygląda na to, że poszło źle w ce5d37c, więc przywrócimy podmoduł z jego rodzica (ce5d37c~).

Alternatywnie, możesz wziąć commit podmodule z tekstu łaty (5d5a3ee314476701a20f2c6ec4a53f88d651df6c) i użyć powyższego procesu "Wewnątrz, Na Zewnątrz".

Kasa w Super-projekcie

$ git checkout ce5d37c~ -- sub

Ten resetuje wpis submodule dla sub do tego co było w commit ce5d37c~ w super-projekt.

Zaktualizuj podmoduł

$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'

Aktualizacja podmodułu przebiegła poprawnie(wskazuje na odłączoną głowicę).

Sprawdź wyniki

$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c

Pierwszy diff pokazuje, że sub jest teraz taki sam w ce5d37c~. Drugie rozróżnienie pokazuje, że indeks i obszar roboczy są takie same. Trzeci diff pokazuje, że jedyną wprowadzoną zmianą jest przeniesienie podmodułu sub do innego commita.

Commit

git commit

Oznacza to wpis stałej submodule.

 382
Author: Chris Johnsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 10:53:49

Spróbuj tego:

git submodule sync
git submodule update
 191
Author: Lonre Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-17 13:50:10

Ten błąd może oznaczać brak commita w podmodule. Oznacza to, że repozytorium (A) ma podmoduł (B). A chce wczytać B tak, aby wskazywało na określony commit (w B). Jeśli w jakiś sposób brakuje tego commita, otrzymasz ten błąd. Po ewentualnej przyczynie: odniesienie do commita zostało wypchnięte W A, ale rzeczywisty commit nie został wypchnięty z B. więc zacznę od tego.

Mniej prawdopodobne, że występuje problem z uprawnieniami, a commit nie może zostać wyciągnięty (możliwe, jeśli używasz git+ssh).

Upewnij się, że ścieżki podmodułu wyglądają dobrze .git / config i .gitmodules.

Jeszcze jedna rzecz do wypróbowania-wewnątrz katalogu podmodułów: git reset HEAD --hard

 16
Author: Daniel Tsadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-15 21:25:13

Możliwa przyczyna

Może się to zdarzyć, gdy:

  1. Submodule zostały edytowane w miejscu
  2. submodule(s) committed, które aktualizują hash podmodułu wskazywanego na
  3. Submodule(S) nie wypychane.

Np. stało się coś takiego:

$ cd submodule
$ emacs my_source_file  # edit some file(s)
$ git commit -am "Making some changes but will forget to push!"

Powinien mieć podmoduł popchnięty w tym momencie.

$ cd .. # back to parent repository
$ git commit -am "updates to parent repository"
$ git push origin master

W rezultacie, brakujące commity nie mogą być znalezione przez zdalnego użytkownika, ponieważ są nadal na dysku lokalnym.

Rozwiązanie

Informuje osobę, która zmodyfikowała podmoduł do push, czyli

$ cd submodule
$ git push
 10
Author: chriskelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-11 17:06:22

Dostałem ten błąd kiedy to zrobiłem:

$ git submodule update --init --depth 1

Ale commit w projekcie nadrzędnym wskazywał na wcześniejszy commit.

Usunięcie folderu podmodułu i uruchomienie:

$ git submodule update --init
Nie rozwiązał problemu. Usunąłem repo 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, aby znaleźć dokładne poprawki lub wersję.

 6
Author: Plato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-14 20:59:04

Twoja branża może nie być aktualna, proste rozwiązanie, ale spróbuj git fetch

 6
Author: kittycatbytes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-27 15:25:43

Może się to zdarzyć również wtedy, gdy masz podmoduł wskazujący na repozytorium, które zostało zrebasowane, a dany commit "zniknął". Chociaż commit 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 twojego repozytorium), musisz zaktualizować super projekt, aby wskazać nowy commit. Alternatywnie możesz wypchnąć jedną z kopii podmodułów gdzie indziej, a następnie zaktualizować super-projekt, aby wskazać to repozytorium.

 5
Author: pasamio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-29 09:19:20

Ta odpowiedź jest dla użytkowników SourceTree z ograniczonym doświadczeniem w obsłudze terminala git.

Otwórz problematyczny podmoduł wewnątrz projektu Git (super-projekt).

Fetch i upewnij się, że zaznaczono 'Fetch all tags'.

Rebase pull your Git project.

To rozwiąże problem "reference is not a tree" 9 na 10 razy. Ten 1 raz nie będzie, jest poprawką terminala, jak opisano w górnej odpowiedzi.

 2
Author: ericTbear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 23:40:54

Historia twojego submodule jest bezpiecznie zachowana w submodule git.

Więc dlaczego po prostu nie usunąć podmodułu i dodać go ponownie?

W Przeciwnym Razie, czy próbowałeś ręcznie edytować HEAD LUB refs/master/head w podmodule .git

 1
Author: Lakshman Prasad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 07:22:28

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 problem.

 1
Author: Gman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 17:27:16

W moim przypadku żadna z powyższych odpowiedzi nie rozwiązuje problemu, nawet jeśli są to dobre odpowiedzi. Więc zamieszczam moje rozwiązanie (w moim przypadku są dwa klienty git, klient a i B):

  1. Idź do submodule ' s dir:

    cd sub
    
  2. Checkout do mistrza:

    git checkout master
    
  3. Rebase do kodu zatwierdzającego, który może zobaczyć zarówno klient

  4. Wróć do katalogu rodzica:

  5. Commit to master

  6. Zmiana na innego klienta, do rebase jeszcze raz.

  7. Wreszcie działa dobrze teraz! Może stracić kilka commitów, ale to działa.

  8. Dla twojej wiadomości, nie próbuj usuwać submodułu, pozostanie tam .git/modules i nie będzie mógł ponownie odczytać tego submodułu, chyba że będzie reaktywny lokalny.

 1
Author: kimimaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 08:13:32

Aby zsynchronizować Git repo z głowicą submodule, na wypadek, gdyby naprawdę tego chcesz, odkryłem, że usunięcie submodule, a następnie odczytanie go pozwala uniknąć majstrowania w historii. Niestety usunięcie podmodułu wymaga raczej hackingu niż pojedynczego polecenia git, ale wykonalnego.

Kroki, które wykonałem, aby usunąć podmoduł, zainspirowany https://gist.github.com/kyleturner/1563153 :

  1. Uruchom git RM --cached
  2. Usuń odpowiednie wiersze z .plik gitmodules.
  3. skreślić odpowiednią sekcję z .git / config.
  4. Usuń teraz nie śledzone pliki podrzędne.
  5. Usuń katalog .git / modules /

Ponownie, może to być przydatne, jeśli wszystko, co chcesz, to ponownie skierować na głowę submodule, a nie skomplikowałeś rzeczy, potrzebując zachowania lokalnej kopii submodule w stanie nienaruszonym. Zakłada, że masz podmoduł "prawo" jako własne repo, gdziekolwiek jest jego pochodzenie, i po prostu chcesz wrócić do prawidłowo włączając go jako podmoduł.

Uwaga: zawsze wykonuj pełną kopię swojego projektu przed rozpoczęciem tego rodzaju manipulacji lub jakichkolwiek poleceń git poza prostym zatwierdzeniem lub push. Radziłbym to również przy wszystkich innych odpowiedziach i jako ogólne wytyczne dla Gita.

 1
Author: matanster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-29 11:53:42

Właśnie natknąłem się na ten problem i Żadne z tych rozwiązań nie zadziałało na mnie. To, co okazało się rozwiązaniem dla mojego problemu, jest o wiele prostsze: upgrade Git. Mój był 1.7.1, a po uaktualnieniu go do 2.16.1 (najnowszy), problem zniknął bez śladu! Chyba go tu zostawiam, mam nadzieję, że komuś pomoże.

 1
Author: An Phan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-04 12:17:26