it-swarm.com.de

Erhalte Fehlermeldung '' fatal: sha1-Informationen fehlen oder sind nutzlos ", wenn ein Patch mit" git am -3 "angewendet wird

Ich versuche, eine Reihe von Patches aus einem Git-Repository auf ein anderes Git-Repository mit git am -3 "Pfad zu einem Patch" anzuwenden. Ich wende sie in der richtigen Reihenfolge an, ab Patch 1-4 funktioniert es gut.

Aber wenn ich zum 5. Patch komme, bekomme ich die Fehlermeldung "fatal: sha1 Informationen fehlen oder nutzlos". Ich gehe zum git-Repository, wo ich den Patch anwende, ich sehe die Datei 'dev/afile'. Ich frage mich, warum git sich beschwert, dass "sha1-Informationen fehlen oder nutzlos sind (dev/afile.c)." "und wie kann ich mein problem beheben?

 $ 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".

Und warum heißt es "Patch bei 0001 erster Patch fehlgeschlagen", wenn ich "git am -3 ~/Tmp/mypatches/0005-5th.patch" mache, wird es ohne Fehler abgeschlossen.

Vielen Dank.

24
michael

Die mit 0001- beginnende Patch-Datei kann nicht sauber angewendet werden - es gibt einen Konflikt.

Git wollte diesen Konflikt lösen, indem er sich die Commits ansah, auf denen dieser Patch basiert, aber Sie haben diese Commits nicht in Ihrem Repository. 

Wahrscheinlich wurde der Patch aus einem Zweig erstellt, für den Commits verwendet wurden, die noch nie freigegeben wurden, oder der Zweig Ihres oder des übergebenden Benutzers wurde neu basiert.

Es spielt keine Rolle, dass der Patch 0005- ohne Fehler angewendet werden kann. Der Fehler bezieht sich speziell auf 0001-.

10
Kornel

Verwenden Sie in Ihrem Projekt Submodule?

In git 1.7.12 bis 1.8.1.2 gab es einen Fehler, bei dem ein aktualisiertes Submodul dazu führen würde, dass eine Rebase (oder ein Patch) mit der Fehlermeldung fehlschlug:

fatal: sha1 Informationen fehlen oder sind nutzlos

das Commit leer lassen, wenn es angewendet wird.

Mehr Infos hier .

Die Aktualisierung von git auf Version 1.8.4 behebt dieses Problem

9
jonasl

Habe gerade folgendes getan und konnte dieses Problem lösen:

patch -p1 < example.patch
5
Pini Cheyni

Ich bin auf dieses Problem gestoßen, als ich versuchte, den Patch in einem falschen Zweig zu erstellen. 

Ich dachte "git format-patch ..." könnte bestimmen, was ich wollte, weil Sie den Hauptzweig und den Zweig angeben können, den Sie im Format-Patch-Aufruf patchen möchten. Ich erkannte, dass es falsch war, weil es Commits erwähnte, die Teil einer Branche waren, die auf der Site, auf der ich ein Patch hatte, nicht existierte.

Kurz gesagt, stellen Sie sicher, dass Sie sich beim Erstellen des Patches in dem Zweig befinden, den Sie patchen möchten.

3

Ich hatte dies beim Versuch, Patches aus einem Repository in einem Repository anzuwenden, das nicht zusammenhängende Geschichte hatte (dasselbe Projekt, aber mit wiederhergestellter Git-Historie). Der Grund, warum Sie die Meldung fatal: sha1 information is lacking or useless (dev/afile.c) erhalten, ist, dass wenn git versucht, eine dreifache Zusammenführung durchzuführen, muss es auf den Status dieser Datei zugreifen. Auf diese Dateien wird durch die Hashes in der Format-Patch-Ausgabe verwiesen (z. B.).

diff --git a/dev/afile.c b/dev/afile.c
index ebbd50fc0b7..ef1ca87ead0 100644
--- a/dev/afile.c
+++ b/dev/afile.c

ebbd50fc0b7 und ef1ca87ead0 beziehen sich auf Hashes des Inhalts der Dateien, nicht auf das Festschreiben von Hashes.

Wenn du es versuchst:

git cat-file blob <hash from patch>

Git wird berichten:

fatal: Not a valid object name <hash from patch>

Git kann sie nicht finden, da diese Versionen der Datei nicht in Ihrem lokalen Repository verfügbar sind (daher die Nachricht Repository lacks necessary blobs to fall back on 3-way merge.). Sie können diese Objekte in Ihrem lokalen Repository verfügbar machen mit:

git remote add old_repo <url>
git fetch old_repo

Wenn du jetzt rennst:

git cat-file blob <hash from patch>

Sie sollten den Inhalt dieser Datei erhalten. Versuchen Sie es erneut mit Ihrem git am-Befehl, und es sollte in der Lage sein, 3 Wege zusammenzuführen.

0
Russell Gallop