У меня есть проект с субмодулем, который указывает на недействительный коммит: коммит субмодуля остается локальным, и когда я пытаюсь получить его из другого репо, я получаю:
$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'
Я знаю, каким должен быть подмодуль HEAD, есть ли способ, которым я могу изменить это локально, не нажимая на репо, который делает есть коммит 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
?
Я не уверен, что мне все ясно ... вот похожая ситуация, которую я обнаружил.
git
git-submodules
Маурисио Шеффер
источник
источник
Ответы:
Предполагая, что репозиторий подмодуля содержит коммит, который вы хотите использовать (в отличие от коммита, на который ссылается текущее состояние суперпроекта), есть два способа сделать это.
Первый требует, чтобы вы уже знали коммит из подмодуля, который вы хотите использовать. Он работает «изнутри наружу», напрямую настраивая подмодуль, а затем обновляя суперпроект. Второй работает извне, находя коммит супер-проекта, который изменил подмодуль, и затем сбрасывает индекс супер-проекта для ссылки на другой коммит суб-модуля.
Наизнанку
Если вы уже знаете, какой коммит вы хотите использовать
cd
в субмодуле, выберите в субмодуле коммит, который вы хотите,git add
а затем иgit commit
его обратно в супер-проекте.Пример:
К сожалению, кто-то сделал супер-проект коммита, который ссылается на неопубликованный коммит в субмодуле
sub
. Почему-то мы уже знаем, что хотим, чтобы субмодуль был в коммите5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Идите туда и проверьте это непосредственно.Оформить заказ в субмодуле
Так как мы проверяем коммит, это приводит к отсоединению HEAD в подмодуле. Если вы хотите убедиться, что субмодуль использует ветку, используйте
git checkout -b newbranch <commit>
для создания и извлечения ветку при фиксации или извлечение ветки, которую вы хотите (например, ту, у которой в подсказке есть нужная фиксация).Обновление Супер-проекта
Оформление заказа в подмодуле отражается в суперпроекте как изменение рабочего дерева. Таким образом, мы должны поэтапно изменить индекс супер-проекта и проверить результаты.
Проверьте результаты
Обновление субмодуля было тихим, потому что субмодуль уже находится в указанной фиксации. Первый diff показывает, что индекс и рабочее дерево совпадают. Третья разница показывает, что единственное поэтапное изменение - это перемещение
sub
подмодуля в другой коммит.совершить
Это фиксирует фиксированную запись субмодуля.
Снаружи
Если вы не уверены, какой коммит вам следует использовать из подмодуля, вы можете посмотреть историю в суперпроекте, чтобы он вам помог. Вы также можете управлять сбросом прямо из супер-проекта.
Это та же ситуация, что и выше. Но на этот раз мы сосредоточимся на том, чтобы починить его из суперпроекта, а не заглядывать в подмодуль.
Найти Странствующий коммит Супер-проекта
ОК, похоже, что все пошло не
ce5d37c
так, поэтому мы восстановим подмодуль из его родителя (ce5d37c~
).В качестве альтернативы, вы можете взять коммит субмодуля из текста патча (
5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) и использовать вместо него вышеописанный процесс «изнутри, снаружи».Оформить заказ в Супер-проекте
Это сбрасывает запись субмодуля для
sub
того, что было в коммитеce5d37c~
в суперпроекте.Обновите субмодуль
Обновление субмодуля прошло нормально (это указывает на отключенную ГОЛОВКУ).
Проверьте результаты
Первый diff показывает, что
sub
теперь то же самое вce5d37c~
. Вторая разница показывает, что индекс и рабочее дерево совпадают. Третья разница показывает, что единственное поэтапное изменение - это перемещениеsub
подмодуля в другой коммит.совершить
Это фиксирует фиксированную запись субмодуля.
источник
e47c0a
что это коммит, которого нет в локальном репозиторииsub
, но супер-проектsub
указывает на этот коммит. Это могло произойти из-за того, что кто-то еще создалe47c0a
в своей копииsub
, обновил свой супер-проект, чтобы указать на этот коммит, и отправил супер-проект, не отправляяe47c0a
в центральный / общий репозиторий дляsub
. Когда мы вытягиваем из центрального / общего супер-проекта мы получаем коммит , что точкиsub
вe47c0a
, но мы не можем «видеть» , что совершить.ce5d37c
это подозрительно, потому что, на основании различий, он ввелe47c0a
.sub
хранящегося в родительском репо, который имеет его в качестве подмодуля, и может ли он быть напрямую обработан для текущего HEADsub
напрямую, не полагаясь на более старое состояние родителя РЕПО, что не всегда может помочь.попробуй это:
источник
git submodule sync
необходимо в сценариях, где URL удаленного для данного подмодуля изменился. В нашем случае мы добавили наш субмодуль из публичного репозитория, а затем изменили URL-адрес на частный форк - и попали в этот конкретный рассол.Эта ошибка может означать, что в подмодуле отсутствует коммит. То есть хранилище (A) имеет подмодуль (B). A хочет загрузить B так, чтобы он указывал на определенный коммит (в B). Если этот коммит как-то отсутствует, вы получите эту ошибку. Однажды возможная причина: ссылка на коммит была помещена в А, но фактический коммит не был перенесен из Б. Поэтому я бы начал с этого
Менее вероятно, есть проблема с разрешениями, и фиксация не может быть получена (возможно, если вы используете git + ssh).
Убедитесь, что пути подмодулей выглядят нормально в .git / config и .gitmodules.
Последнее, что нужно попробовать - внутри директории подмодуля: git reset HEAD --hard
источник
Возможная причина
Это может произойти, когда:
например, что-то подобное произошло:
В этом месте должен быть нажат субмодуль.
В результате этого удаленный пользователь не может обнаружить отсутствующие коммиты, поскольку они все еще находятся на локальном диске.
Решение
Informa человек, который изменил субмодуль для push, т.е.
источник
Я получил эту ошибку, когда я сделал:
но коммит в родительском проекте указывал на более ранний коммит.
Удаление папки submodule и запуск:
НЕ решил проблему. Я удалил репо и попробовал снова без флага глубины, и это сработало.
Эта ошибка возникает в Ubuntu 16.04 git 2.7.4, но не в Ubuntu 18.04 git 2.17, TODO находит точную фиксацию фиксации или версию.
источник
username/repo#sha
в package.json, гораздо более гибкий вариант - организовать вашу систему с помощью набора докер-контейнеров--depth=1
экономит столько пропускной способности, когда мне не нужна история репо. Если кто-нибудь когда-нибудь найдет или знает, почему это происходит, я бы хотел знать.deinit
подход, который решает проблему большую часть времени. В комплекте с системой сборки конечный пользователь может просто позволить системе сборки извлечь субмодули и полностью отказаться от сломаннойrecursive
команды. Есть все еще сценарии, где это прерывается, например, субмодуль сделал принудительный толчок и полностью уничтожил коммит.Это также может произойти, если у вас есть субмодуль, указывающий на репозиторий, который был перебазирован, и данный коммит «пропал». Хотя фиксация все еще может находиться в удаленном репозитории, она не находится в ветке. Если вы не можете создать новую ветку (например, не свой репозиторий), вы застряли с необходимостью обновить супер проект, чтобы он указывал на новый коммит. В качестве альтернативы вы можете перенести одну из своих копий подмодулей в другое место, а затем обновить супер-проект, указав вместо этого этот репозиторий.
источник
Ваша ветка может быть не в курсе, простое решение, но попробуйте
git fetch
источник
Этот ответ предназначен для пользователей SourceTree с ограниченным опытом работы с терминалом.
Откройте проблемный субмодуль из проекта Git (супер-проект).
Получите и убедитесь, что флажок «Получить все теги» отмечен.
Rebase тянуть ваш проект Git.
Это решит проблему «ссылка не дерево» 9 из 10 раз. Это 1 раз, это не будет, это исправление терминала, как описано в верхнем ответе.
источник
Ваша история субмодулей в любом случае безопасно сохраняется в подмодуле git.
Итак, почему бы просто не удалить подмодуль и добавить его снова?
В противном случае, вы пытались вручную редактировать
HEAD
илиrefs/master/head
в подмодуле.git
источник
Просто чтобы быть уверенным, попробуйте обновить ваши
git
двоичные файлы.GitHub для Windows имеет версию,
git version 1.8.4.msysgit.0
которая в моем случае была проблемой. Обновление решило это.источник
В моем случае ни один из приведенных выше ответов не решает проблему, даже если они являются хорошими ответами. Поэтому я публикую свое решение (в моем случае это два клиента git, клиент A и B):
перейти в каталог подмодуля:
Оформить заказ мастеру:
перебазировать в код коммита, который видит оба клиента
вернитесь в каталог родителей:
поручить освоить
перейти к другому клиенту , сделать
rebase
снова.наконец-то теперь все работает нормально! Может быть, потерять пару коммитов, но это работает.
К вашему сведению, не пытайтесь удалить ваш подмодуль, он останется
.git/modules
там и не сможет снова прочитать этот подмодуль, если он не является локальным реактивным.источник
Чтобы синхронизировать репозиторий git с головой субмодуля, в случае, если это действительно то, что вам нужно, я обнаружил, что удаление субмодуля и последующее его чтение позволяет избежать работы с историей. К сожалению, удаление подмодуля требует взлома, а не единственной команды git, но выполнимой.
Шаги, которые я выполнил, чтобы удалить подмодуль, вдохновлены https://gist.github.com/kyleturner/1563153 :
Опять же, это может быть полезно, если все, что вам нужно, это снова указать на головку подмодуля, и вы не усложнили задачу, сохранив локальную копию подмодуля в целости и сохранности. Предполагается, что у вас есть подмодуль «право» в качестве собственного репо, где бы он ни находился, и вы просто хотите вернуться к правильному включению его в качестве подмодуля.
Примечание: всегда делайте полную копию своего проекта перед тем, как приступить к подобным манипуляциям или любой команде git, кроме простого коммита или толчка. Я бы посоветовал это со всеми другими ответами, а также в качестве общего руководства Git.
источник
Просто наткнулся на эту проблему, и ни одно из этих решений не помогло мне. То, что оказалось решением моей проблемы, на самом деле намного проще: обновить Git. Мой был 1.7.1, и после того, как я обновил его до 2.16.1 (последний), проблема ушла без следа! Думаю, я оставляю это здесь, надеюсь, это кому-нибудь поможет.
источник