Zum Importieren der alten Snapshots finden Sie einige der Tools in Git's contrib/fast-import directory nützlich. Oder, wenn Sie sich bereits alte Schnappschuss in einem Verzeichnis haben, können Sie etwas tun:
# Assumes the v* glob will sort in the right order
# (i.e. zero padded, fixed width numeric fields)
# For v1, v2, v10, v11, ... you might try:
# v{1..23} (1 through 23)
# v?{,?} (v+one character, then v+two characters)
# v?{,?{,?}} (v+{one,two,three} characters)
# $(ls -v v*) (GNU ls has "version sorting")
# Or, just list them directly: ``for d in foo bar baz quux; do''
(git init import)
for d in v*; do
if mv import/.git "$d/"; then
(cd "$d" && git add --all && git commit -m"pre-Git snapshot $d")
mv "$d/.git" import/
fi
done
(cd import && git checkout HEAD -- .)
Dann die alte Geschichte in Ihre Arbeits Repository holen:
cd work && git fetch ../import master:old-history
Einmal Wenn Sie sowohl die alte Historie als auch Ihre Git-basierte Historie im selben Repository haben, haben Sie eine Reihe von Optionen für die Vorbereitungsoperation: Grafts und Ersetzungen.
Grafts sind ein pro-Repository-Mechanismus, um die Herkunft verschiedener existierender Commits (möglicherweise vorübergehend) zu bearbeiten. Transplantate werden von der Datei $GIT_DIR/info/grafts
gesteuert (beschrieben unter "info/grafts" der gitrepository-layout manpage).
INITIAL_SHA1=$(git rev-list --reverse master | head -1)
TIP_OF_OLD_HISTORY_SHA1=$(git rev-parse old-history)
echo $INITIAL_SHA1 $TIP_OF_OLD_HISTORY_SHA1 >> .git/info/grafts
Mit dem Transplantat an Ort und Stelle (der ursprüngliche Anfang begangen hat keine Eltern hat, gab das Transplantat es einen Elternteil), können Sie all normalen Git-Tools verwenden, um durch die Suche und die erweiterte Geschichte sehen (zB git log
sollte dir nun die alte Geschichte nach deinen Commits zeigen).
Das Hauptproblem bei Transplantaten ist, dass sie auf Ihr Repository beschränkt sind. Aber, wenn Sie entscheiden, dass sie ein fester Bestandteil der Geschichte sein sollten, können Sie git filter-branch verwenden, um sie so zu machen (machen Sie eine tar/zip-Sicherung von Ihrem .git
dir zuerst; git filter-branch wird gespeichert Originalreferenzen, aber manchmal ist es einfacher, ein einfaches Backup zu verwenden).
git filter-branch --tag-name-filter cat -- --all
rm .git/info/grafts
Der Ersatz-Mechanismus ist neuer (Git 1.6.5 +), aber sie können auf einer Pro-Befehl-Basis (git --no-replace-objects …
) und sie können zum leichteren Austausch geschoben deaktiviert werden. Replacement arbeitet an einzelnen Objekten (Blobs, Trees, Commits oder Annotated Tags), also ist der Mechanismus auch allgemeiner. Der Austauschmechanismus ist in der git replace manpage dokumentiert. Aufgrund der Allgemeinheit, (haben wir die neue Mutter Namensgebung ein neuer begehen, anstatt nur erstellen) die „Prepending“ Setup ein wenig mehr beteiligt ist:
# the last commit of old history branch
oldhead=$(git rev-parse --verify old-history)
# the initial commit of current branch
newinit=$(git rev-list master | tail -n 1)
# create a fake commit based on $newinit, but with a parent
# (note: at this point, $oldhead must be a full commit ID)
newfake=$(git cat-file commit "$newinit" \
| sed "/^tree [0-9a-f]\+\$/aparent $oldhead" \
| git hash-object -t commit -w --stdin)
# replace the initial commit with the fake one
git replace -f "$newinit" "$newfake"
Freigabe dieser Ersatz ist nicht automatisch.Sie müssen einen Teil von (oder allen) refs/replace
drücken, um den Ersatz zu teilen.
git push some-remote 'refs/replace/*'
Wenn Sie sich entscheiden, die Ersetzung dauerhaft zu machen, verwenden Sie git filter-branch (wie bei Transplantationen; eine tar/zip Sicherung Ihrer .git
Verzeichnis machen zuerst):
git filter-branch --tag-name-filter cat -- --all
git replace -d $INITIAL_SHA1
Siehe auch [Bearbeiten/Ändern/Ändern/Ändern der ersten/root/initial commit in Git?] (Http://stackoverflow.com/q/2119480/456814), [Ändern der ersten Commit des Projekts mit Git?] (http://StackOverflow.com/Q/2246208/456814), und [Git: Wie füge ich Commits vor dem ersten/initialen/root-Commit hinzu?] (http://StackOverflow.com/q/16762160/456814). –
@Cupcake Danke, ich sah nie die Benachrichtigung für Ihre Links –