453 Stimmen

Wie kann ich eine Git-Übertragung in der Vergangenheit vornehmen?

Ich bin dabei, alles für meinen persönlichen Gebrauch auf Git umzustellen, und ich habe einige alte Versionen einer Datei gefunden, die sich bereits im Repository befinden. Wie übertrage ich sie in der richtigen Reihenfolge gemäß dem Änderungsdatum der Datei in den Verlauf, damit ich einen genauen Verlauf der Datei habe?

Mir wurde gesagt, dass so etwas funktionieren würde:

git filter-branch --env-filter="GIT_AUTHOR_DATE=... --index-filter "git commit path/to/file --date " --tag-name-filter cat -- --all

47voto

Vilson Vieira Punkte 637

Ich verwende die folgende Datei, um Änderungen zu übertragen foo a N=1 Tage in der Vergangenheit:

git add foo
git commit -m "Update foo"
git commit --amend --date="$(date -v-1d)"

Wenn Sie sich auf ein noch älteres Datum festlegen wollen, z. B. 3 Tage zurück, ändern Sie einfach die date Argument: date -v-3d .

Das ist sehr nützlich, wenn man z. B. gestern vergessen hat, etwas zu übertragen.

UPDATE : --date akzeptiert auch Ausdrücke wie --date "3 days ago" oder sogar --date "yesterday" . Wir können es also auf einen einzeiligen Befehl reduzieren:

git add foo ; git commit --date "yesterday" -m "Update"

46voto

skierpage Punkte 2344

In meinem Fall hatte ich im Laufe der Zeit eine ganze Reihe von Versionen von myfile wie myfile_bak, myfile_old, myfile_2010, backups/myfile usw. Ich wollte die Historie von myfile in Git unter Verwendung des Änderungsdatums ablegen. Also benenne ich das älteste in myfile um, git add myfile entonces git commit --date=(modification date from ls -l) myfile , Umbenennung des nächstältesten in myfile, weiterer Git-Commit mit --date, Wiederholung...

Um dies etwas zu automatisieren, können Sie shell-foo verwenden, um die Änderungszeit der Datei zu ermitteln. Ich begann mit ls -l y cut , aber stat(1) ist direkter

git commit --date="\`stat -c %y _myfile_\`" _myfile_

22voto

JstRoRR Punkte 3693

In meinem Fall stürzte der Git-Prozess bei Verwendung der Option --date ab. Vielleicht habe ich etwas Schreckliches getan. Und als Ergebnis erschien eine index.lock-Datei. Also löschte ich die .lock-Dateien manuell aus dem .git-Ordner und führte aus, dass alle geänderten Dateien an den übergebenen Daten übertragen werden, und dieses Mal hat es funktioniert. Vielen Dank für alle Antworten hier.

git commit --date="`date --date='2 day ago'`" -am "update"

11voto

petertc Punkte 3004
  1. git --date nur Änderungen GIT_AUTHOR_DATE aber viele Git-Anwendungen, z. B. GitHub, zeigen GIT_COMMITTER_DATE . Stellen Sie sicher, dass Sie die GIT_COMMITTER_DATE auch.
  2. git kennt die Zeitzone in der Standard-UNIX-Datumsausgabe nicht. Stellen Sie sicher, dass Sie das Datumsformat in einem kompatiblen Format wie ISO8601 formatieren.

Vollständiges Beispiel in OS X (Ändern Sie beide GIT_COMMITTER_DATE y GIT_AUTHOR_DATE bis vor 4 Stunden):

x=$(date -v -4H +%Y-%m-%dT%H:%M:%S%z); export GIT_COMMITTER_DATE=$x; git commit --amend --date $x

9voto

rel1x Punkte 2221

Oder verwenden Sie einfach eine fake-git-history um sie für einen bestimmten Datenbereich zu erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X