2012-10-19 6 views
8

Ich benutze Avery Pennarun's Git-Teilbaum, der eine Erweiterung zu Git ist.Wie gehe ich mit git-subtree zu einem bestimmten Commit?

Wie kann ich einen Commit von einem Sub-Repo in meine Haupt-Repo mit Git Teilbaum auswählen? Wie gehe ich zu einem bestimmten Commit in der Geschichte des Sub-Repos, nachdem ich bereits einen Git-Teilbaum an diesem Präfix gezogen habe?

Ich betreibe dies in erster Linie im Squash-Commits-Modus.

Antwort

5

Wie gehe ich zu einem bestimmten Commit in der Geschichte des Sub-Repo?

Wenn Sie die Commits gequetscht haben, dann gibt es keine Möglichkeit, da der Squash die verschiedenen Commits verliert.

Andernfalls können Sie mit einem nicht gequetschten Teilbaum zu jedem Commit des Teilbaums mit dem gleichen Hash wie im ursprünglichen Repository navigieren, aus dem der Teilbaum erstellt wurde.

git subtree (ohne den Squash) fügt alle relevanten Commits aus dem externen Repository als unabhängigen Baum in Ihrem aktuellen Repository in Ihr Repository ein. Wenn Sie eine git subtree add tun, können Sie feststellen, dass mehrere Commits hinzugefügt wurden (alle ursprünglichen Commits aus dem externen Repo) und eine letzte Zusammenführung Commit, die den Inhalt aus diesem Teilbaum in das angegebene Verzeichnis mit der Option --prefix verschoben. Kurz gesagt, es prüft einen Zweig von einem anderen, nicht verwandten Repository und fügt es dann in Ihren aktuellen Zweig ein, indem der gesamte Inhalt in einen bestimmten Unterordner verschoben wird.

All dies bedeutet, dass Ihnen die Historie des externen Repos zur Verfügung steht, Sie können es einfach so auschecken, wenn Sie daran denken, dass dieser Checkout wahrscheinlich den gesamten Inhalt Ihres Arbeitsbereichs verändert , die bei großen Projekten lange dauern können.

Dies bewegt uns zum zweiten:

Wie kann ich herauspicken ein von einem Unter Repo in meinem Haupt-Repo-git Teilstruktur unter Verwendung begehen?

Scheint wie es ist nicht aktuelle "cherrypicking" unterstützt von git subtree auf sich. Aber angesichts der Implikationen all des oben genannten kann Folgendes getan werden.

# move yourself to the subtree commit of your choice 
git checkout <subtree-hash> 

# fetch commits from the subtree repository, to have available the commit you want 
# to cherry pick. 
git fetch <path-to-remote> 

# cherry pick the hash you want 
git cherry-pick <cherry-hash> 

# move back to your original branch 
git checkout <your-branch> 

# subtree merge your cherry pick (using the previous HEAD), 
# so that it gets moved to the correct location specified by prefix. 
git subtree merge --prefix <subtree-prefix> [email protected]{1} 

# Since you probably fetched more commits that you needed from 
# the remote, you might want to clean those that where not needed 
git gc 

berücksichtigen, dass diese nach tun, wenn Sie zu git subtree pull in Ihren Unterbaum versuchen, ein Update, und es enthält die Sie Kirsche begeht gepflückt, werden Sie mit einem Konflikt beenden, da Sie zwei Änderungen an der gleichen Stelle haben .

Eine andere einfachere Option, wenn Sie Zugriff auf die ursprüngliche Teilbaum-Repository haben, ist es, die Kirsche holen dort in einer Branche und dann nur git subtree pull dieser bestimmten Branche.

+1

Ich untersuchte dies übrigens mit 'git Version 1.8.1', die bereits den Unterbaumbefehl enthält. – LopSae