2010-07-02 12 views
9

Unter Windows habe ich eine Multi-Datei diff mit:Wie Diff anwenden von Windows SVN auf Linux angewendet?

svn diff > mydiff.diff 

bewegt Dann ist es auf Linux-Rechner (mit der gleichen Version des gleichen Repo, keine Änderungen). Wie cai ich es anwenden?

patch -p0 < mydiff.diff 

Nach der Ausführung erhalte ich folgende Ausgabe:

patching file licstat/test/unittest/test_licstatactioncontainers.cpp 
File licstat/test/unittest/test_licstatactioncontainers.cpp is not empty after patch, as expected 
patching file licstat/test/unittest/test_licstatactions.cpp 
Hunk #1 FAILED at 99. 
1 out of 1 hunk FAILED -- saving rejects to file licstat/test/unittest/test_licstatactions.cpp.rej 
can't find file to patch at input line 295 
Perhaps you used the wrong -p or --strip option? 
The text leading up to this was: 
-------------------------- 
|Index: licstat/test/unittest/test_licenseserverusagemap.cpp 
|=================================================================== 
|--- licstat/test/unittest/test_licenseserverusagemap.cpp  (revision 6767) 
|+++ licstat/test/unittest/test_licenseserverusagemap.cpp  (working copy) 
-------------------------- 
File to patch: 

Und die letzte Zeile ist für meine Aktion prompt warten.

Wie soll ich den Patch erstellen/anwenden, damit er funktioniert?

(bearbeiten) Jetzt sehe ich, dass die Datei fehlte und Diff hat es nicht erstellt. Nach dem Erstellen die Datei manuell erhalte ich Fehler wie folgt aus:

patching file licstat/misc/generic/mysql/stored_procedures.sql 
Hunk #1 FAILED at 220. 
Hunk #2 FAILED at 245. 
Hunk #3 FAILED at 622. 
Hunk #4 FAILED at 661. 
Hunk #5 FAILED at 810. 
Hunk #6 FAILED at 822. 
Hunk #7 FAILED at 868. 
Hunk #8 FAILED at 999. 
8 out of 8 hunks FAILED -- saving rejects to file licstat/misc/generic/mysql/stored_procedures.sql.rej 

Antwort

0

Diese Art von Fehler kann auftreten, wenn das lokale Dateiformat CRLF statt LF ist, wenn Sie auf einem Unix-System sind.

patch versucht, den svn diff-Patch an das Unix-Dateiformat anzupassen, stolpert jedoch, wenn sich die lokalen Dateien im DOS-Modus befinden. Dies kann passieren, wenn Sie Codebasen zwischen DOS- und UNIX-Umgebungen freigeben.

Was funktioniert für mich ist es, zunächst alle Dateien zu konvertieren etwa zum Beispiel betroffen werden:

grep ^+++ patchfile.patch | awk '{print $2}' | dos2unix 

Und dann den Patch zu installieren:

patch -p0 < patchfile.patch 
0

ich ziemlich Dateien regelmäßig patchen zwischen ein Windows und Mac-System und patch scheint mit den Zeilenumbrüche richtig zu tun, so dass ich glaube nicht, dass das das Problem ist. Es sieht so aus, als ob Sie test_licstatactioncontainers.cpp gelöscht haben und die erste Warnung ist darüber. Der zweite scheint sich darüber zu beschweren, dass er die Datei selbst nicht gefunden hat.

Könnte dies ein Problem mit dem Dateinamen sein? Windows ist für den Dateinamen case unempfindlich, Linux dagegen nicht. Wird die Datei tatsächlich als Test_LicenceServerUsageMap.cpp unter Linux bezeichnet? Oder das Verzeichnis LicStat/Test?

+0

Ja, ich die Datei (mit SVN) entfernt, so dass es in Ordnung sein sollte. Nein, alle Verzeichnis-/Dateinamen sind in Kleinbuchstaben geschrieben. – ssobczak

0

Versuchen Sie, die Zeilenenden in der Patch-Datei von DOS nach Unix zu konvertieren, indem Sie den Befehl dos2unix verwenden.

+0

Dies funktioniert nicht, wenn die zugrunde liegende Datei gemischte Zeilenenden hat. – dshin

7

Die Verwendung von "dos2unix" hilft nicht, wenn Sie CR + LF-Zeilen in Ihre Dateien unter Linux einspeisen.

Dieser Befehl sollte die Arbeit mit einer beliebigen Kombination von Linie tun Feeds:

patch -p0 -l --binary < patch.diff