2010-08-13 2 views
5

Zum Beispiel, wenn ich zwei Dateien:Kann nicht Standard-Diff-Patch auf Solaris anwenden

file1:

This is file 1 

und file2:

This is file 2 

und erstellen Patch mit der folgenden Befehl:

diff -u file1 file2 > files.patch 

Ergebnis ist:

--- file1  Fri Aug 13 17:53:28 2010 
+++ file2  Fri Aug 13 17:53:38 2010 
@@ -1,1 +1,1 @@ 
-This is file 1 
+This is file 2 

Dann, wenn ich versuche, diesen Patch auf Solaris mit Patch Befehl anwenden:

patch -u -i files.patch 

es hängt an:

Looks like a unified context diff. 
File to patch: 

1. Gibt es eine Möglichkeit Solaris zu verwenden nativer Patch-Befehl mit vereinheitlichten Diffs?

2. Welches Vergleichsformat gilt als am tragbarsten, wenn es nicht möglich ist, ein einheitliches Format anzuwenden?

Update: ich Antwort auf den ersten Teil meiner Frage gefunden habe. Scheint, dass patch auf Solaris hängt, wenn die zweite Datei (Datei2 in diesem Fall) in dem gleichen Ordner wie der erste (Datei1) existiert. Zum Beispiel des folgenden ziemlich allgemein diff:

--- a/src/file.src  Sat Aug 14 23:07:29 2010 
+++ b/src/file.src  Sat Aug 14 23:07:37 2010 
@@ -1,2 +1,1 @@ 
-1 
- 
+2 

nicht mit recht häufig Patch Befehl arbeiten:

patch -p1 -u -d a < file.patch 

während der folgenden diff (note zweite Datei umbenannt wird):

--- a/src/file.src  Sat Aug 14 23:07:29 2010 
+++ b/src/file_new.src  Sat Aug 14 23:07:37 2010 
@@ -1,2 +1,1 @@ 
-1 
- 
+2 

wird perfekt funktionieren.

Für den zweiten Teil meiner Frage siehe akzeptierte Antwort unten.

Antwort

0

Single Unix v2 und v3 unterstützen sowohl Context-Diffs als auch Unified-Diffs, daher sollten Sie für eine bessere Portabilität Context-Diffs verwenden (-c Option zu diff und patch).

Auf älteren Solaris-Versionen (pre-10, glaube ich), müssen Sie sicherstellen, dass /usr/xpg4/bin vor /usr/bin ist in Ihrem $PATH, sonst können Sie die Kompatibilität Versionen einiger Dienstprogramme statt Standard diejenigen bekommen.

+1

Danke, Gilles für Erklärungen. Ich werde in Betracht ziehen, Kontext-Diffs zu verwenden. Soweit ich verstehe, können Sie nicht im Kontext diff Patch-Informationen über die Quelldatei zu ändern. Habe ich recht? Es ist nicht sehr praktisch ... Wie auch immer, ich kann immer noch nicht verstehen, warum ich es versäumt habe, den Patch -u mit diff zu starten, das von diff -u erzeugt wurde. – Shcheklein

+0

@Shcheklein: Was meinst du mit "Patch Informationen über Quelldatei zu ändern"? Kontext-Diffs enthalten Dateinamen. POSIX benötigt 'diff -cr' um unterstützt zu werden, das muss funktionieren. Übrigens, macht "Patch-p0" einen Unterschied? – Gilles

+0

Ja, Kontext-Diffs enthalten genügend Informationen. Das Problem mit Solaris "Patch" war jedoch das andere (siehe Update der Frage). '-p0' macht keinen Unterschied. Scheint, dass "Patch" auf Solaris nicht gefällt, wenn beide Namen in Hunk gleich sind oder beide Dateien existieren. – Shcheklein

6

Auf Solaris /usr/bin/patch ist eine alte Version erforderlich, um einige alte Standards zu erfüllen. Eine moderne Version des GNU-Patches wird unter Solaris 8 und höher als /usr/bin/gpatch bereitgestellt.

+0

Ich weiß. Es ist möglich, dass gpatch nicht standardmäßig installiert ist und nicht sehr gut ist, wenn die Kompilierung Ihres Produkts fehlgeschlagen ist, weil kein gpatch vorhanden ist. – Shcheklein

2
diff -cr old.new new.txt > patch.txt 

gpatch -p0 < patch.txt 

funktioniert perfekt für mich (mit GPatch)