Получить сообщение об ошибке "фатальный: информация sha1 отсутствует или бесполезна", когда применяется патч с использованием "git am -3"
Я пытаюсь применить ряд исправлений из репозитория 1 git к другому репозиторию git, используя путь git am -3 "к патчу". Я применяю их по порядку, начиная с патча 1-4, он отлично работает.
Но когда я прихожу к пятому патчу, я получаю сообщение об ошибке "фатальный: информация sha1 отсутствует или бесполезна". Я перехожу в репозиторий git, где я применяю патч, я вижу файл 'dev/afile'.
Поэтому я удивляюсь, почему git жалуется на "информация sha1 отсутствует или бесполезна (dev/afile.c)" и как я могу исправить свою проблему?
$ git am -3 ~/Tmp/mypatches/0005-fifth.patch
Applying: rpmsg: Allow devices to use custom buffer allocator
fatal: sha1 information is lacking or useless (dev/afile.c).
Repository lacks necessary blobs to fall back on 3-way merge.
Cannot fall back to three-way merge.
Patch failed at 0001 first patch
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".
И почему он сказал, что "Патч не сработал при первом запуске 0001", когда я делаю "git am -3 ~/Tmp/mypatches/0005-5th.patch", он не завершает ошибки.
Спасибо.
Ответы
Ответ 1
Файл патча, начинающийся с 0001-
, не может быть применен чисто - есть конфликт.
Git хотел разрешить этот конфликт, посмотрев на то, что этот патч был основан, но у вас нет этих коммитов в вашем репозитории.
Вероятно, патч был создан из ветки, у которой были коммиты, которые никогда не были разделены, или ваша ветка вашего или отправителя была переустановлена.
Не имеет значения, что патч 0005-
может применяться без ошибок. Ошибка примерно равна 0001-
.
Ответ 2
Используете ли вы подмодули в своем проекте?
В git с 1.7.12 до 1.8.1.2 произошла ошибка: если обновленный подмодуль приведет к сбою с ошибкой (или патчем) с сообщением об ошибке:
фатальный: информация sha1 отсутствует или бесполезна
оставляя фиксатор пустым, если применяется.
Подробнее здесь.
Обновление git до версии 1.8.4 решает эту проблему
Ответ 3
Просто сделал следующее и смог решить эту проблему:
patch -p1 < example.patch
Ответ 4
Я столкнулся с этой проблемой, когда пытался создать патч, находясь не в той ветке.
Я думал, что "git format-patch..." сможет определить, что я хотел, потому что вы можете указать основную ветвь и ветвь, которую вы хотите исправить, в вызове format-patch. Я понял, что это неправильно, потому что в нем упоминались коммиты, которые были частью ветки, которой не было на сайте, к которому я патчил.
Короче говоря, убедитесь, что вы находитесь на ветке, которую хотите патчить при создании патча.
Ответ 5
У меня было это при попытке применить патчи из одного репозитория в тот, у которого была несвязанная история (тот же проект, но с перестроенной историей git). Причина, по которой вы получаете сообщение fatal: sha1 information is lacking or useless (dev/afile.c)
том, что когда git пытается выполнить трехстороннее объединение, ему необходим доступ к состоянию этого файла. На эти файлы указывают хэши в выходных данных исправления формата (например)
diff --git a/dev/afile.c b/dev/afile.c
index ebbd50fc0b7..ef1ca87ead0 100644
--- a/dev/afile.c
+++ b/dev/afile.c
ebbd50fc0b7 и ef1ca87ead0 ссылаются на хэши содержимого файлов, а не на хеши фиксации.
Если вы попытаетесь:
git cat-file blob <hash from patch>
Git сообщит:
fatal: Not a valid object name <hash from patch>
Git не может найти их, потому что эти версии файла недоступны в вашем локальном репозитории (следовательно, в Repository lacks necessary blobs to fall back on 3-way merge.
сообщений Repository lacks necessary blobs to fall back on 3-way merge.
). Вы можете сделать эти объекты доступными в вашем локальном хранилище с помощью:
git remote add old_repo <url>
git fetch old_repo
Теперь, когда вы бежите:
git cat-file blob <hash from patch>
Вам должно быть предоставлено содержимое этого файла. Теперь попробуйте выполнить команду git am
раз, и она сможет выполнить трехстороннее слияние.