Wie ein Git-Patch von einem Repository in ein anderes beantragen?
-
06-09-2019 - |
Frage
Ich habe zwei Repositories, ist eine der Haupt Repo für eine Bibliothek, und das andere ist ein Projekt, das Bibliothek.
Wenn ich eine Lösung, um den in dem unterwürfig Projekt machen, würde ich eine einfache Möglichkeit, mag das Patch wieder stromaufwärts anzuwenden.
Die Lage der Datei unterscheidet sich in jedem Repository.
- Haupt Repo:
www.playdar.org/static/playdar.js
- Projekt:
playlick.com/lib/playdar.js
habe ich versucht, git format-patch -- lib/playdar.js
auf dem playlick Projekt mit, und dann git am
auf der Haupt Playdar Repo, aber die unterschiedlichen Dateispeicherorte in der Patch-Datei wird eine Fehler.
Gibt es eine einfache Möglichkeit, den Patch von einem bestimmten Commit auf einer bestimmten Datei auf eine andere beliebige Datei an anderer Stelle?
anzuwendenFür Bonuspunkte, was passiert, wenn die Datei, die Sie den Patch anwenden möchten nicht in einem Git Repository?
Lösung
Wenn manuelles Bearbeiten der Patch-Datei nicht in Frage oder nicht durchführbar ist, kann dies mit Standard-Optionen durchgeführt wird (erhältlich in git apply
, git format-patch
und GNU patch
).
-
-p<n>
entfernt Verzeichnisse von den Pfaden im Patchn
führt. -
Nach der Verarbeitung
-p
,--directory=<root>
das vor dem jedem des Weg in dem Patchroot
vor der Anwendung.
Beispiel
Also, für Ihr Beispiel, einen Patch zu übernehmen, die ursprünglich auf static/playdar.js
war und es auf lib/playdar.js
, würden Sie laufen:
$ cat patch_file | git am \
-p1 \ # remove 1 leading directory ('static/')
--directory='lib/' # prepend 'lib/'
Andere Tipps
Der Patch von git format-patch
hergestellt ist einfach eine Text file-- Sie die diff-Header bearbeiten können, so dass es einen anderen Weg ändert.
So zum Beispiel würde es so etwas wie diese produziert haben:
diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js
Alles, was Sie tun müssen ist, ändern lib/playdar.js
static/playdar.js
und dann den Patch durch git am"
ausführen
Der Patch sollte von dem Standard GNU Patch-Werkzeug für Menschen lesbar sein, die git
haben nicht --- aber nicht format-patch
mit dem -M
laufen, -C
usw. Optionen umbenennen zu produzieren Patches in diesem Fall, weil die Unterstützung für sie ist nicht universell.
Unter der Annahme, beide Projekte sind git Projekte, klingt es so, dass Submodule wäre die perfekte Passform für Sie. Dies ermöglicht ein git Projekt auf einen anderen git Projekt dynamisch verknüpfen, im Wesentlichen ein Git-Repo-Recht in einem anderen git Repo-Backen, die beide ihre ganz eigenen Leben haben.
Mit anderen Worten, fügen Sie „Haupt Repo“ als Submodul in „Projekt“. Jedes Mal, wenn Sie sich verpflichten / Neuigkeiten in „Haupt Repo“ Push, Sie git pull
sie nur wieder in „Projekt“.
Henriks Abwicklung beantworten , und für den Bonuspunkt gehen
Was passiert, wenn die Datei, die Sie den Patch anwenden möchten nicht in einem Git-Repository ist?
Wenn Sie den Zugriff auf die Verzeichnisse des Datei Kandidaten für einen Patch aus einem Git Repository kommen, könnten Sie zuerst verwandeln den Baum von Verzeichnissen / Dateien in ein Git Repository selbst! ( 'git init
': ein Git Repository ist nur ein .git innerhalb eines Root-Verzeichnis, nachdem alle)
.
Dann würden Sie das Repo als Submodul für Ihr Hauptprojekt festgelegt.
Sie können eine neue Remote hinzufügen und daraus ziehen. Artikel mit Details.
$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA
Sie können einfach entfernen (umbenennen) vorübergehend den Haupt-Repository.
cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git
Mit der --relative
Option format-patch
die Abstraktion verbessern (verstecken irrelevante Details über das Repository, aus dem der Patch erzeugt wurde).
[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'
Ich habe die --3way
Option gefunden erforderlich werden, wenn die Patch-Anwendung (auf does not exist in index
Fehler zu vermeiden) - die Leistung kann variieren. --directory=(...)
Mit wahrscheinlich ist nur erforderlich, wenn Sie Ihr Zielpfad nicht die Wurzel des Endlagers ist.
[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)
-
format-patch
wird eine Patch-Datei erstellen pro da 'Basis' auf den aktuellen Zweig begehen. -
Die Dokumentation für die
--relative
Option scheint in einigen Fällen zu fehlen , aber es scheint irgendwie zu funktionieren (ab Version 2.7.4).