Ich habe zwei Repositorys, eines ist das Haupt-Repo für eine Bibliothek und das andere ist ein Projekt, das diese Bibliothek verwendet.
Wenn ich das untergeordnete Projekt behebe, möchte ich diesen Patch auf einfache Weise wieder stromaufwärts anwenden.
Der Speicherort der Datei ist in jedem Repository unterschiedlich.
- Hauptrepo:
www.playdar.org/static/playdar.js
- Projekt:
playlick.com/lib/playdar.js
Ich habe versucht, git format-patch -- lib/playdar.js
das Playlick-Projekt und dann git am
das Haupt-Playdar-Repo zu verwenden, aber die unterschiedlichen Dateispeicherorte in der Patch-Datei haben einen Fehler ausgelöst.
Gibt es eine einfache Möglichkeit, den Patch von einem bestimmten Commit für eine bestimmte Datei auf eine andere beliebige Datei an einer anderen Stelle anzuwenden?
Was passiert, wenn sich die Datei, auf die Sie den Patch anwenden möchten, nicht in einem Git-Repository befindet?
quelle
Antworten:
Wenn manuelles Bearbeiten der Patch - Datei von der Frage oder undurchführbar ist out, kann dies mit Standardoptionen (erhältlich in getan werden
git apply
,git format-patch
und GNUpatch
).-p<n>
Entferntn
führende Verzeichnisse aus den Pfaden im Patch.Nach der Verarbeitung
-p
,--directory=<root>
prependsroot
zu jedem der Pfade in dem Pflaster vor der Anwendung.Beispiel
Um in Ihrem Beispiel einen Patch zu verwenden, auf den er ursprünglich
static/playdar.js
angewendet wurdelib/playdar.js
, würden Sie Folgendes ausführen:quelle
--directory
: stackoverflow.com/questions/24121709/…Der von erstellte Patch
git format-patch
ist einfach eine Textdatei. Sie können die Diff-Header so bearbeiten, dass ein anderer Pfad geändert wird.So hätte es zum Beispiel so etwas hervorgebracht:
Alles , was Sie tun müssen , ist der Wandel
lib/playdar.js
zustatic/playdar.js
und führen Sie dann den Patch durchgit am"
Der Patch sollte von dem Standard GNU Patch - Werkzeug für Menschen lesbar sein, die nicht über
git
--- aber nicht liefformat-patch
mit den-M
,-C
usw. Optionen zu produzieren Umbenennungs Patches in diesem Fall , da die Unterstützung für sie nicht universell ist.quelle
Angenommen, beide Projekte sind Git-Projekte, dann klingt es so, als würden Submodule perfekt zu Ihnen passen. Auf diese Weise kann ein Git-Projekt dynamisch mit einem anderen Git-Projekt verknüpft werden, wobei im Wesentlichen ein Git-Repo direkt in einem anderen Git-Repo gebacken wird, wobei beide ein eigenes Leben haben.
Mit anderen Worten, fügen Sie "main repo" als Submodul in "project" hinzu. Wann immer Sie neue Sachen in "main repo" festschreiben / pushen, kehren Sie sie einfach
git pull
in "project" zurück.quelle
playdar.js
Datei enthält, und dann in beiden anderen Projekten (ich möchte nicht alles andere auswww.playdar.org
demplaylick.com
Projekt) einschließen, dass ich die Patch-Dateien vorerst nur manuell bearbeiten muss, um ehrlich zu sein . Oder kopieren Sie weiterhin das Einfügen zwischen den beiden. Prost.Um Henriks Antwort zu vervollständigen und den Bonuspunkt zu erhalten
Wenn Sie Zugriff auf die Verzeichnisse des Dateikandidaten für einen Patch haben, der aus einem Git-Repository stammt, können Sie diesen Baum von Verzeichnissen / Dateien zuerst in ein Git-Repository selbst umwandeln! ('
git init
': Ein Git-Repository ist schließlich nur ein Git in einem Stammverzeichnis).Dann würden Sie dieses Repo als Submodul für Ihr Hauptprojekt festlegen.
quelle
Mit der
--relative
Optionformat-patch
können Sie die Abstraktion verbessern (irrelevante Details über das Repository ausblenden, aus dem der Patch generiert wurde).Ich habe festgestellt, dass die
--3way
Option beim Anwenden des Patches erforderlich ist (umdoes not exist in index
Fehler zu vermeiden ) - Ihr Kilometerstand kann variieren. Die Verwendung--directory=(...)
ist wahrscheinlich nur erforderlich, wenn Ihr Zielpfad nicht das Stammverzeichnis des Repositorys ist.format-patch
erstellt eine Patch-Datei pro Commit für den aktuellen Zweig seit 'base'.Die Dokumentation für die
--relative
Option scheint in einigen Fällen zu fehlen , scheint aber trotzdem zu funktionieren (ab Version 2.7.4).quelle
Sie können eine neue Fernbedienung hinzufügen und daraus ziehen. Artikel mit Details.
quelle
Sie können das Haupt-Repository einfach vorübergehend entfernen (umbenennen).
quelle
Ich denke, Teilbaum ist die beste Lösung für Ihr Problem
Tutorial 1
Tuorial 2
quelle