2010-07-10 8 views
12

Ich habe zwei Git-Repositories, die tangential verwandt sind. Der Inhalt von einem war nämlich ein Vorgänger des anderen. Ich würde gerne die gesamte Geschichte von Depot A dem Depot B voranstellen, so dass Tipp von A ein Elternteil des allerersten Changeset von Depot B wäre? Geschichten in beiden sind ziemlich linear.Wie verkette ich zwei Git Histories?

Ist das möglich?

Antwort

9

Sie könnten versuchen, die Graft-Datei (.git/info/grafts), wo Sie die Elternschaft von einem Commit überschrieben werden könnten (wie die ersten von projectB spätestens von projectA für Eltern mit)

Siehe auch „What are .git/info/grafts for?“ und „How to prepend the past to a git repository?“ für mehr zu dieser Manipulation.


skaleecomments über den Artikel "Git: Grafting repositories" (von SO Benutzer Ben Straub) für ein konkretes Beispiel. Jetzt

, was wir tun wollen ist der erste in der „nuevo“ Repo („New commit #1“), so begehen ändern, dass seine Eltern ist der letzte in der „alten“ Repo („Old # 3“) verpflichten. Zeit für einige Voodoo:

git fetch ../old master:ancient_history 

Git Sie von jedem anderen Git Repository holen können, ob diese Repo es verwandt ist oder nicht! Brillant! Dies lässt uns mit diesem:

enter image description here

Hinweis, wie wir die alten Meister Zweig zu ancient_history umbenannt. Hätten wir das nicht getan, hätte Git versucht, die beiden zusammenzubringen und wahrscheinlich angewidert aufzugeben.

Jetzt haben wir noch ein Problem.
Die beiden Bäume sind nicht miteinander verbunden, und in der Tat wird ein "git pull" nicht einmal den Zweig "ancient_history" erreichen. Wir brauchen einen Weg, um eine Verbindung zwischen den beiden herzustellen.

Git hat eine Einrichtung namens Transplantat, die im Grunde eine Elternverbindung zwischen zwei Commits vortäuscht.
Um zu machen, nur eine Linie in die in diesem Format .git/info/grafts Datei einfügen:

[ref] [parent] 

Beide brauchen die volle Hash der Commits in Frage zu sein. Also lassen Sie uns finden sie:

$ git rev-list master | tail -n 1 
d7737bffdad86dc05bbade271a9c16f8f912d3c6 

$ git rev-parse ancient_history 
463d0401a3f34bd381c456c6166e514564289ab2 

$ echo d7737bffdad86dc05bbade271a9c16f8f912d3c6 \ 
     463d0401a3f34bd381c456c6166e514564289ab2 \ 
     > .git/info/grafts 

(in einer Zeile, wie suggested von ssokolow)

echo $(git rev-list master | tail -n 1) $(git rev-parse ancient_history) > .git/info/grafts 

Es.Jetzt ist unsere Geschichte wie folgt aussieht:

enter image description here

Klonen dieses Repo-Ergebnisse in dieser:

enter image description here

Woops. Es stellt sich heraus, dass Transplantate nur für das lokale Repository wirksam werden. Wir können dieses Problem beheben mit umsichtiger Anwendung von git fast-import:

$ git fast-export --all > ../export 

$ mkdir ../nuevo-complete 

$ cd ../nuevo-complete 

$ git init 

$ git fast-import < ../export 
git-fast-import statistics: [...] 

(in einer Zeile, wie suggested von ssokolow)

git filter-branch $(git rev-parse ancient_history)..HEAD 

Diese effektiv wandelt unsere „fake“ Geschichte Link in sind alleine.
Alle Ingenieure müssen aus diesem neuen Repository re-klonen, da die Hashes alle unterschiedlich sein werden, aber das ist ein kleiner Preis für keine Ausfallzeit und eine komplette Historie.

enter image description here

Als Qix Kommentare below:

fast-import erscheint die git Informationen nur zu importieren, aber überprüfen Sie nichts aus.
git init ursprünglich setzt Sie auf Master, so Sie brauchen eine git reset --hard HEAD, um tatsächlich die Dateien nach Ihnen fast-import zu überprüfen.

+0

Arbeitete ganz gut für mich, danke vonC, dachte nicht, dass es so einfach wäre. – SilentGhost

+1

Dann können Sie den Verlauf mit 'git filter-branch' neu schreiben, um das Transplantat dauerhaft zu machen ... aber das schreibt die Geschichte neu. –

+0

Kurz und ordentlich Artikel, der mir wirklich geholfen hat, zu verstehen, was Transplantate sind und Schritt-für-Schritt, wie man diesen Geschichten beitritt: http://ben.straubnet.net/post/939181602/git-grafting-repositories – skalee

Verwandte Themen