Ich frage mich, ob es eine Möglichkeit gibt, ein Push-Datum für jedes Commit im Git-Protokoll anzuzeigen. Wenn dies nicht möglich ist, gibt es eine Möglichkeit, alle Commits unter einem bestimmten Push anzuzeigen.
Ich schreibe ein Programm, das die Commits verfolgen muss, wenn sie gepusht werden. Da das Git-Protokoll nach dem Festschreibungsdatum und nicht nach dem Push-Datum sortiert ist, kann ich die letzten übertragenen Commits nicht sehen. Wenn ein Benutzer beispielsweise 2 Tage vor dem Push an den Master ein Commit für sein lokales Repository durchführt, wird dieses Commit hinter 2 Tage anderer Commits im Master-Repository-Protokoll platziert.
git reflog --date=local origin/master
(Notizorigin/
), um die Liste der Pushs zu sehen. Ansonsten waren nur Commits, Checkout und Pulls in der Liste (was auch nützlich ist). Eigentlich wurde ich durch die Antwort von @ JonathanDay darauf hingewiesen .Git ist ein verteiltes Versionskontrollsystem, daher müssen Sie sorgfältig definieren, was Sie unter "Push-Datum" verstehen. Angenommen, Benutzer A überträgt einige Commits an das Repository von Benutzer B. Einige Zeit später überträgt Benutzer B dieselben Commits an ein drittes Repository. An welchem Datum interessieren Sie sich?
Ich spekuliere, dass Sie ein freigegebenes Repository haben und möchten, dass die Benutzer dieses freigegebenen Repositorys feststellen können, wann etwas im Repository veröffentlicht wurde. Wenn dies zutrifft, müssen Sie diese Informationen im freigegebenen Repository sammeln.
Die schlechten Nachrichten
Leider gibt es keine Möglichkeit, das Datum an die Festschreibungsnachrichten anzuhängen. Dies würde die Festschreibungs-ID (die ein SHA1-Hash des Inhalts ist) ändern und alle möglichen Probleme verursachen.
Die guten Nachrichten
Glücklicherweise hat Git eine (relativ neue) Funktion namens Notizen . Mit dieser Funktion können Sie Commits beliebigen Text anhängen, der
git log
angezeigt werden kann. Notizen können bearbeitet und mit anderen geteilt werden.Mit der Notizenfunktion können Sie jedem Commit die Nachricht "Dieses Commit wurde am [Datum] empfangen" hinzufügen, sobald es vom freigegebenen Repository empfangen wird.
Siehe
git help notes
für Details.So zeichnen Sie das Datum auf
Hier ist der Ansatz, den ich empfehle:
post-receive
Hook in Ihrem freigegebenen Repository, um jedes neu erreichbare Commit für jede aktualisierte Referenz zu durchlaufen.Fügen Sie für jedes Commit etwas wie "[Benutzer] von [repository_url] fügte dieses Commit zu [ref] am [Datum] hinzu" an die Notiz des Commits an.
Möglicherweise möchten Sie
refs/notes/received-on
anstelle der Standardeinstellung eine Notizenreferenz verwenden, die diesem Zweck (wie ) gewidmet istrefs/notes/commits
. Dies verhindert Konflikte mit Notizen, die für andere Zwecke erstellt wurden.receive
Hook, um Aktualisierungen Ihrer Notizenreferenz zu verweigern (damit Benutzer nicht versehentlich oder absichtlich mit den Notizen herumspielen).Bitten Sie alle Benutzer, die folgenden Befehle in ihrem Arbeitsbaum auszuführen:
Dieser Schritt ist erforderlich, da Git standardmäßig nicht verzweigte Verweise ohne Tags in Upstream-Repositorys ignoriert.
Das oben Gesagte setzt voraus, dass Verweise nur erweitert, niemals gelöscht oder zwangsweise aktualisiert werden. Sie möchten wahrscheinlich, dass der
post-receive
Hook auch Notizen zum Entfernen am [Datum] anfügt, um diese Fälle zu behandeln.quelle
Das scheint für mich ziemlich gut zu funktionieren. Das Committer-Datum (% cd) ist irreführend, da es nicht unbedingt mit dem Push-Datum übereinstimmt. Die Option --date = iso gibt jedoch das Push / Fetch-Datum aus .
Beachten Sie, dass beim Abrufen vom Ursprung / Master das Datum gedruckt wird, an dem Sie es abgerufen haben. NICHT das Datum, an dem jemand anderes das Commit gedrückt hat.
Bonus: Sie können natürlich hübscher formatieren. Bisher gefällt mir diese Farbcodierung. Es ist allerdings ein bisschen viel zu tippen. Dadurch wird der SHA auf Rot, der Reflog-Selektor auf Cyan und der Reflog auf Grün gesetzt.
quelle
Schau es dir an
git reflog show master
. Wahrscheinlich nicht das genaue Format, das Sie möchten, aber Sie sollten in die richtige Richtung weisen.Eine andere Idee ist das Ausführen eines Skripts in einem Push-Hook.
quelle
git reflog show master
? Ich möchte das Push-Datum der einzelnen Commits jedes Benutzers anzeigen können..git/logs/refs/heads/master
darin wird ein Zeitstempel angezeigt.git reflog
für diese Angelegenheit.Diese Antwort bezüglich der Überprüfung des Reflogs auf der Fernbedienung kann hilfreich sein ( https://stackoverflow.com/a/8791295/336905 ), indem sie Ihnen Informationen darüber gibt, welcher Zweig durchgeschoben wurde, auch wenn er nicht anzeigt , welche Commits übertragen wurden, aber Sie könnte sich gegenseitig korrelieren, indem der nächste Push nach dem lokalen Festschreibungsdatum gefunden wird. Nicht narrensicher, aber praktisch, wenn Sie den ausgezeichneten Notizenvorschlag von @RichardHansen, der zuvor veröffentlicht wurde, noch nicht implementiert haben
quelle
origin/branch
nur die auf dem aktuellen Computer vorgenommenen Änderungen angezeigt werden , ist dies äußerst nützlich! Für den täglichen Gebrauch möchte ich keine Hooks implementieren, also für eine einfache Frage: "Hmmm, als ich das Commit letzte Woche gepusht habe?" - Es funktioniert großartig.Sie können auch die Änderungszeit der Datei für die Festschreibungsobjektdatei im Verzeichnis "Objekte" im Git-Repository auf dem Server selbst anzeigen.
quelle
Warum unterscheidet sich git AuthorDate von CommitDate?
AuthorDate
Dies ist der Zeitpunkt, an dem das Commit zum ersten Mal erstellt wurde.CommitDate
Dies ist der Zeitpunkt, an dem das Commit zuletzt geändert wurde (z. B. Rebase).Sie können diese mit den
--pretty
Formatierungsoptionen erhalten:Also, wenn Sie und andere Entwickler tun werden ,
git rebase
bevorgit push
, werden Sie mit einem Ende begehen Zeitpunkt , der später als der ist Autor Datum .Dieser Befehl zeigt das Festschreibungsdatum an:
git log --pretty=fuller
quelle
Ich denke, Sie können die nächste Notation verwenden, um das Push-Datum zu erhalten: git log -g --date = local
quelle