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

Получить сообщение об ошибке "фатальный: информация 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", он не завершает ошибки.

Спасибо.

4b9b3361

Ответ 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 раз, и она сможет выполнить трехстороннее слияние.