Gibt es eine Möglichkeit, einen mit git format-patch erstellten Patch so zu erstellen, dass er svn-kompatibel ist, damit ich ihn an ein svn-Repo senden kann?
Ich arbeite an einem SVN-Repo auf Github und möchte meine Änderungen an das Haupt-Repo zurücksenden. Ich muss dazu einen Patch erstellen, der Patch kann jedoch nicht angewendet werden, da Git-Formate anders patchen als svn. Gibt es ein Geheimnis, das ich noch nicht entdeckt habe?
UPDATE: Obwohl es derzeit kein Skript oder keine native Git-Methode gibt, habe ich es geschafft, einen Beitrag von Anfang dieses Jahres darüber zu finden, wie dies manuell erreicht werden kann. Ich habe die Anweisungen befolgt und hatte Erfolg damit, dass meine Git-Patches mit svn funktionieren.
Wenn jemand versuchen könnte, ein Skript zu schreiben, um dies zu erreichen und zum Git-Projekt beizutragen, wäre ich jeder sehr dankbar.
http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308
quelle
Antworten:
Ich muss das immer googeln, aber ich habe festgestellt, dass es (für mich) perfekt funktioniert:
git diff --no-prefix master..branch > somefile.diff
, der Master- und der Zweigteil sind optional, hängt davon ab, wie Sie Ihre Diffs erhalten möchten.patch -p0 < somefile.diff
.Es scheint immer gut für mich zu funktionieren und scheint die einfachste Methode zu sein, die mir begegnet ist.
quelle
--no-pager
ist keine Option mehr fürgit diff
.--no-pager
, ich bin nicht sicher, warum es in der Bearbeitung hinzugefügt wurde. Es hat immer gut für mich ohne funktioniert--no-pager
.git diff --no-prefix 056a1ba5140 7d939289b80 >my.patch
hat für mich gearbeitet (wo056a1ba5140
und7d939289b80
sind die sha-1 des vorherigen und bestimmten Commits in git).Die kurze Antwort lautet
patch -p1 -i {patch.file}
.Weitere Informationen finden Sie in diesem Blog: Erstellen von Subversion-Patches mit git .
quelle
Hier ist ein Hilfsskript, um einen Unterschied zwischen dem neuesten svn-Änderungssatz und dem angegebenen Commit zu machen: http://www.mail-archive.com/[email protected]/msg00864.html
quelle
git svn info
stattdessen so zu verwenden :REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
SVN kann die Ausgabe von wahrscheinlich nicht verstehen
git diff -p
, aber Sie können auf Brute Force zurückgreifen:diff -r
Sie die beiden Klone durchlaufen .quelle
git diff --no-prefix > somefile.diff
Ihr Git-Repo aus und senden Sie es an einen beliebigen SVN-Benutzer, damit dieser den Patchpatch -p0 < somefile.diff
im Stammverzeichnis des Projekts anwenden kann .Subversion <1.6 unterstützt keine Patches. Es sieht so aus, als ob Subversion 1.7 das Anwenden von Patches ermöglicht und die Git / HG-Erweiterungen für Unified Diff auf unserer TODO-Liste stehen.
quelle
Es ist in der Tat eine Funktionsanforderung Anfang 2008
Linus Torvalds sagte damals:
Das mag der Grund sein
wurde im Mai / Juli 2008 in Git1.5.6 eingeführt (ich habe es jedoch nicht getestet)
quelle
Stellen Sie sicher, dass Ihre Änderungen auf Ihrem lokalen Git-Zweig festgeschrieben und neu basiert werden.
git show --pretty >> myChangesFile.patch
quelle
Die von Nicholas bereitgestellte akzeptierte Antwort funktioniert einwandfrei, außer wenn a) Binärdateien im Diff vorhanden sind oder b) Sie in Windows Git arbeiten und Verzeichnisse mit Leerzeichen haben. Um dies zu beheben, musste ich einen verschachtelten git diff-Befehl hinzufügen, um Binärdateien zu ignorieren, und einen sed-Befehl, um die Leerzeichen zu verlassen. Das Schreiben ist etwas umständlich, daher habe ich einen Alias erstellt:
Wenn Sie dann Folgendes eingeben:
... wird eine Patch-Datei Feature123.patch mit den Unterschieden zwischen der Zusammenführungsbasis von Zweigmaster und Zweig Feature123 erstellt.
quelle