Подтвердить что ты не робот

Git обновление подмодуля обновления фатальной ошибки: ссылка не является деревом

user$ sudo git submodule update
fatal: reference is not a tree: a094dcfeeb43fcd62a9e466156e05e7581026f33
Unable to checkout 'a094dcfeeb43fcd62a9e466156e05e7581026f33' in submodule path 'client/src/util'

Что мне делать? Я просто хочу получить чистую копию последнего кода из репо, я не против потерять свои изменения. Как вы можете сказать, я явно не уверен, что происходит. Я могу только думать, что он пытается проверить файл, что означает, что git обнаружил локальное изменение в файле на моей локальной машине.

В настоящее время я использую OSX

4b9b3361

Ответ 1

Это наиболее распространенная проблема с подмодулями. Конец, в котором вы находитесь во внешнем репозитории, имеет ссылку на фиксацию в подмодуле, которую кто-то еще не нажал. Это проблема зависимости. Всегда выталкивайте изнутри наизнанку. Это скорее всего не то, что вы сделали неправильно, а кто-то другой, который работает в репозитории. Они были неаккуратными и забывали выпускать подмодуль и просто толкали содержащее хранилище. Вещи работают на своей машине, потому что они внесли изменения, и эти коммиты существуют. Пойдите, шлепайте их и сообщите им, чтобы подтолкнуть их изменения подмодулей:)

В противном случае это может быть вашей ошибкой, если вы работаете на другой машине, и вы забыли нажать изменения подмодуля. Теперь вы находитесь в другом месте и думаете: "WTF! Это мои изменения, и они тоже должны работать!"

Ответ 2

В большинстве случаев это будет случай, описанный Adam Dymitruk, но другой случай, который может вызвать это, заключается в переключении ветвей, у которых есть подмодули, которые меняли пульты. Это связано с тем, что обновление подмодуля просто пытается выполнить проверку фиксации, но до добавления и выбора нового пульта он не сможет.

Вы можете проверить это, посмотрев файл .gitmodules и сравнив URL подмодулей с показанным cd'ing в подмодуле и выполнив git remote -v

В этом случае вам нужно будет запустить git submodule sync, чтобы уведомить субмодуль о удаленном изменении, а затем git submodule update --init --recursive, чтобы избавиться от этой ошибки.

Ответ 3

Ошибка означает, что конкретная фиксация (ее sha1) недоступна из любого из ссылок ref при клонировании вашего подмодуля, поэтому вы должны либо обновить свой подмодуль с действительной ссылкой, либо reset изменениями к последней версии.

Это может произойти, когда у вас есть новые коммиты в вашей вилке, локальные или вы включили ссылки на ваш отдельный HEAD, но вы не ввели их в свой основной репозиторий, на который указывает подмодуль git URL.

В reset подмодуль вручную до источника/ведущего, введите субдир субмодуля и выполните reset, например

cd client/src/util
git reset origin/master --hard

Если вы хотите исправить ссылку в основном репо, после выполнения выше выполните изменения:

# Still in submodule dir.
git pull origin master # In submodule dir.
git push origin master
cd - # Go back to the main repo dir.
git status
git commit -am 'Update submodule refs'
git push

Если вы хотите вытащить ссылки из fork в начало, вы можете попробовать:

cd client/src/util # Go to submodule dir again.
git remote add fork [email protected]:example/foo.git
git pull fork master
git show a094dcfeeb43fcd62a9e466156e05e7581026f33 # Check previously missing sha1. 
git push origin master:master # Or: master:some_branch

Ответ 4

Скорее всего, ваш репозиторий подмодулей не имеет ревизии, на которую ссылается внешний репозиторий. И он также может быть недоступен на удаленном, указанном для субмодуля, или у вас нет удаленной настройки для подмодуля. Вы можете попробовать войти в client/src/util и git fetch там.

(почему вы sudo это? если оно принадлежит root, почему вы не находитесь в корневой оболочке, а если нет, то почему вы меняете root?)

Ответ 5

В дополнение к ответам Адама Дымтрука и Майкла Чинина я столкнулся с этой проблемой из-за максимальной длины пути Windows. Если я попытаюсь клонировать определенное репо с 3-уровневыми глубокими субмодулями, в моем каталоге Documents/Visual Studio 2013/Projects я получаю fatal: reference is not a tree. Но если я повторяю тот же самый точный клон в моем домашнем каталоге, он отлично работает.