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:
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:
Klonen dieses Repo-Ergebnisse in dieser:
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.
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.
Arbeitete ganz gut für mich, danke vonC, dachte nicht, dass es so einfach wäre. – SilentGhost
Dann können Sie den Verlauf mit 'git filter-branch' neu schreiben, um das Transplantat dauerhaft zu machen ... aber das schreibt die Geschichte neu. –
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