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?

anzuwenden

Für Bonuspunkte, was passiert, wenn die Datei, die Sie den Patch anwenden möchten nicht in einem Git Repository?

War es hilfreich?

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).

  1. -p<n> entfernt Verzeichnisse von den Pfaden im Patch n führt.

  2. Nach der Verarbeitung -p, --directory=<root> das vor dem jedem des Weg in dem Patch root 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

Ich denke, subtree die beste Lösung für Ihr Problem ist

Tutorial 1

Tuorial 2

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top