Wäre es sinnvoll, git rebase
unter Beibehaltung der Commit-Zeitstempel eine Leistung zu erbringen?
Ich glaube, eine Konsequenz wäre, dass die neue Niederlassung nicht unbedingt chronologisch festgeschriebene Daten haben wird. Ist das theoretisch überhaupt möglich? (zB mit Sanitärbefehlen; hier nur neugierig)
Wenn es theoretisch möglich ist, ist es dann in der Praxis mit Rebase möglich, die Zeitstempel nicht zu ändern?
Angenommen, ich habe den folgenden Baum:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Wenn ich jetzt auf oldbranch
Basis master
von Commit bin, ändert sich das Datum des Commits von Februar 1984 bis Juni 2010. Ist es möglich, dieses Verhalten so zu ändern, dass der Commit-Zeitstempel nicht geändert wird? Am Ende würde ich also erhalten:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
Wäre das überhaupt sinnvoll? Ist es in git überhaupt erlaubt, eine Historie zu haben, in der ein altes Commit ein neueres Commit als Elternteil hat?
quelle
git rebase --committer-date-is-author-date SHA
. Siehe meine bearbeitete Antwort untenAntworten:
Update Juni 2014: David Fraser erwähnt in den Kommentaren eine Lösung, die ebenfalls unter " Ändern von Zeitstempeln beim erneuten Basieren des Git-Zweigs " unter Verwendung der Option
--committer-date-is-author-date
(ursprünglich im Januar 2009 in Commit 3f01ad6 eingeführt) aufgeführt istSiehe
git am
:(Ursprüngliche Antwort, Juni 2012)
Sie könnten versuchen, eine nicht interaktive Basis zu erstellen
(aus dieser SO Antwort )
Dies wird weitergegeben an
git am
, in dem Folgendes erwähnt wird:Für
git rebase
, ist diese Option „Nicht kompatibel mit der --interactive Option.“Da Sie den Zeitstempel des alten Festschreibungsdatums (mit
git filter-branch
) nach Belieben ändern können, können Sie Ihren Git-Verlauf vermutlich in der gewünschten / benötigten Reihenfolge des Festschreibungsdatums organisieren und sogar auf die Zukunft einstellen! .Wie Olivier in seiner Frage erwähnt, wird das Autorendatum niemals durch eine Rebase geändert.
Aus dem Pro Git Book :
Um es in diesem Fall besonders deutlich zu machen, wie Olivier kommentiert:
quelle
git rebase --ignore-date
nicht. Es ändert die Daten der neu basierten Commits.--ignore-date
macht das Gegenteil von dem, was ich erreichen wollte! Es löscht nämlich den Zeitstempel des Autors und ersetzt ihn durch die Commit-Zeitstempel! Die richtige Antwort auf meine Frage lautet also: Tu nichts, dagit rebase
sich die Zeitstempel der Autoren standardmäßig nicht ändern.--committer-date-is-author-date
Option den Autorenzeitstempel zu verlassen scheint und den Committer-Zeitstempel auf den ursprünglichen Autorenzeitstempel einstellt, was Olivier wollte ...Wenn Sie die Festschreibungsdaten bereits verkorkst haben (möglicherweise mit einer Rebase) und sie auf die entsprechenden Autorendaten zurücksetzen möchten, können Sie Folgendes ausführen:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
quelle
WARNING: Ref 'refs/heads/master' is unchanged
. Ich benutze Git Version 1.7.9.5 unter Linux (64 Bit)git rebase --committer-date-is-author-date <base_branch>
diese Weise setzt git das Festschreibungsdatum nur für die auf <base_branch> angewendeten Festschreibungen zurück (was wahrscheinlich der ist der gleiche Filialname, den Sie verwendet haben, als Sie es vermasselt haben).Eine entscheidende Frage von Von C hat mir geholfen zu verstehen, was los ist: Wenn Sie Ihre Basis neu festlegen, ändert sich der Zeitstempel des Committers , nicht jedoch der Zeitstempel des Autors , was plötzlich alles Sinn macht. Meine Frage war also eigentlich nicht präzise genug.
Die Antwort ist, dass Rebase die Zeitstempel des Autors nicht ändert (dafür müssen Sie nichts tun), was perfekt zu mir passt.
quelle
Standardmäßig setzt git rebase den Zeitstempel des Committers auf den Zeitpunkt, zu dem das neue Commit erstellt wird, behält jedoch den Zeitstempel des Autors bei. Meistens ist dies das gewünschte Verhalten, aber in einigen Szenarien möchten wir auch den Zeitstempel des Commiters nicht ändern. Wie können wir das erreichen? Nun, hier ist der Trick, den ich normalerweise mache.
Stellen Sie zunächst sicher, dass jedes Commit, das Sie neu erstellen möchten, eine eindeutige Commit-Nachricht und einen Zeitstempel für den Autor enthält (hier muss der Trick verbessert werden, derzeit entspricht er jedoch meinen Anforderungen).
Notieren Sie vor dem Rebase den Zeitstempel des Committers, den Zeitstempel des Autors und die Commit-Nachricht aller Commits, die in eine Datei zurückgesetzt werden.
Lassen Sie dann die eigentliche Rebase stattfinden.
Schließlich ersetzen wir den Zeitstempel des aktuellen Committers durch den in der Datei aufgezeichneten, wenn die Commit-Nachricht mit identisch ist
git filter-branch
.Wenn etwas schief geht, einfach auschecken
git reflog
oder allerefs/original/
Refs.Darüber hinaus können Sie das Gleiche wie mit dem Zeitstempel des Autors tun.
Wenn beispielsweise der Zeitstempel des Autors für einige Commits nicht in der richtigen Reihenfolge ist und diese Commits nicht neu angeordnet werden sollen, soll der Zeitstempel des Autors nur in der richtigen Reihenfolge angezeigt werden. Die folgenden Befehle helfen dabei.
quelle