Was ist das Format für --date Parameter von Git Commit

78

Ich muss das Datum des Commits von git überschreiben, alle Dokumentationen verweisen auf den Parameter --date, lassen dann aber einen ohne Hinweis auf das entsprechende Format. Ich habe jede erdenkliche Permutation ausprobiert und erhalte den Fehler "fatal: ungültiges Datumsformat:" für jede einzelne.

v010dya
quelle
1
Dass einige Antworten auf diese Frage meine teilweise beantworten. Ich habe gerade überprüft und es funktioniert. Übrigens müssen Sie den Wochentag nicht dort eintragen (das wäre schmerzhaft).
v010dya

Antworten:

82

Git 2.6+ (Q3 2015) fügt eine neue Option hinzu.

Siehe Commit e4f031e (30. Juni 2015) und Commit aa1462c , Commit a5481a6 , Commit b7c1e11 (25. Juni 2015) von Jeff King ( peff) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit d939af1 , 3. August 2015)

Datumsmodus "Format" einführen

Dies führt das Format direkt an strftime.
Neben der Flexibilität ist der Hauptvorteil, dass Ihr System strftimemöglicherweise mehr über das bevorzugte Format Ihres Gebietsschemas weiß (z. B. wie man die Wochentage buchstabiert).

--date=format:...füttert das ...System mit Ihrem Format strftime.
Verwenden Sie --date=format:%cdiese Option , um das Datum im bevorzugten Format Ihres Systemgebietsschemas anzuzeigen.
Im strftimeHandbuch finden Sie eine vollständige Liste der Formatplatzhalter.

Davide Cavestro schlägt in den Kommentaren das Beispiel vor:

git commit -m "Test" --date=format:relative:5.hours.ago 

Ursprüngliche Antwort (Mitte 2014)

Die --dateOption (eingeführt in Commit 02b47cd im Dezember 2009 für git1.7.0) verwendet dasselbe Format wie für GIT_AUTHOR_DATE, wobei Datumsformate in Commit 96b2d4f getestet wurden :

Dort sehen Sie die verschiedenen akzeptierten Formate:

  • rfc2822: Mon, 3 Jul 2006 17:18:43 +0200
  • iso8601: 2006-07-03 17:18:43 +0200
  • lokal: Mon Jul 3 15:18:43 2006
  • kurz: 2006-07-03(nicht in 1.9.1, funktioniert in 2.3.0)
  • relativ: siehe Commit 34dc6e7 :

    5.seconds.ago, 
    2.years.3.months.ago, 
    '6am yesterday'
    
  • raw: siehe Commit 7dff9b3 (Git 1.6.2, März 2009)
    internes Raw-Git-Format - Sekunden seit Epoche plus Zeitzone
    ( anders ausgedrückt: ' date +"%s %z"' Format)

  • Standard: Mon Jul 3 17:18:43 2006 +0200

ADTC fragt und antwortet in den Kommentaren :

Akzeptiert es 2006-07-03 15:18:43 für lokale?

Ja, es funktioniert und es wird automatisch die lokale Zeitzone verwendet.
Mit diesem Format muss ich nicht die Mühe , an welchem Tag der Woche ist es ( Sun, Monusw.).

VonC
quelle
Akzeptiert es 2006-07-03 15:18:43für lokale ? Was sind relative und rohe Formate?
ADTC
Um meine erste Frage zu beantworten: Ja, es funktioniert und es wird automatisch die lokale Zeitzone verwendet. Mit diesem Format muss ich mich nicht darum kümmern, welcher Wochentag es ist (So, Mo usw.).
ADTC
1
@ADTC Ich habe Links und Verweise für das relative und das Rohdatumformat hinzugefügt. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
1
@CiroSantilli nicht sicher: das könnte eine gute separate Frage sein. Ich werde es mit 1.9.4 testen.
VonC
1
@CiroSantilli 六四 事件 法轮功 Vielen Dank für die Bearbeitung, toll, dieses kurze Format in 2.3.0 zu sehen.
VonC
8

Das Datumsformat ist unter Documentation / date-formats.txt ( man git commit) unterdokumentiert und sehr "humanisch" analysiert.

Das einzige, was funktioniert, ist, die Quelle unter date.c zu lesen und auszuprobieren .

Von VonC am 2.3.0 nicht erwähnte Punkte:

  • Nur Ziffern werden abhängig von der Anzahl der Ziffern analysiert:

    • 2 Ziffern: 19JJ, für JJ> = 73, aktueller Monat, Tag und Uhrzeit. Fehler oder aktuelles Datum sonst.

    • 4 Ziffern: JJJJ, für JJJJ> = 1973, <= 2099

    • > 8 Stellen bis zu einer kleinen Grenze (TODO welche?): UNIX-Zeit (Sekunden seit 1970)

  • @<digits> +0000: UNIX-Zeit.

    Dies scheint der beste Weg zu sein, um UNIX-Zeiten direkt einzugeben.

    2 ** 64 - 2 (TODO warum nicht -1?) War der Maximalwert, der nicht zu einem Festschreibungsfehler führt. Der Stempel ist in einem C lang gespeichert.

    git logzeigt sehr große Werte (irgendwo in der 2^55Nähe von TODO wo?) als 1970, obwohl git cat-file -p HEADzeigt, dass die richtige Nummer gespeichert wurde, so dass es wie eine Einschränkung der Datumskonvertierung erscheint.

    Für alles 2**63 - 1, was größer ist als das größte positive, das lange signiert ist, schlägt der Versuch, auf GitHub zu pushen, fehl date causes integer overflow. Ein Commit zu diesem Datum auf GitHub (GitHub kann aus irgendeinem Grund keine wirklich großen Daten anzeigen )

    VonC wies darauf hin, dass dies eine Schande ist, da es negative Daten blockiert. Ist es möglich, ein Git-Commit festzulegen , um einen Zeitstempel vor 1970 zu haben? Dies könnte verwendet werden, um ältere Software auf Git zu migrieren.

  • tea: heute um 17h :-)

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
Beachten Sie, dass bei Git-Repos-Initiativen, die vom Datum abhängig sind (wie diese: stackoverflow.com/q/29385441/6309 ), Daten vor 1970 schön wären: stackoverflow.com/a/24977895/6309
VonC
3
@VonC: schöner Link. Mir war nicht in den Sinn gekommen, dass die Versionskontrolle seit den 60er / 70er Jahren existiert. Programmers.stackexchange.com/questions/184695/… und Text seit dem Jahr -3200. Was ist, wenn sie Hammurabis Code auf Git migrieren möchten? :-) (ah, habe gerade herausgefunden, dass jemand dies bereits getan hat: github.com/elia/hammurabi/blob/master/lib/hammurabi/code.txt , hat aber die Zeitstempel verloren)
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功
3

Einfaches Beispiel:

GIT_AUTHOR_DATE='2015-04-19 17:18:43 +0200' GIT_COMMITTER_DATE='2015-04-19 17:18:43 +0200' git commit -m 'Commit message'
Dmytro Melnychuk
quelle
Die Verwendung von Umgebungsvariablen scheint die einzige Möglichkeit zu sein, das Festschreibungsdatum festzulegen. Keine Argumentationsoptionen dafür.
Jarl
1

Die folgenden abgekürzten Formen würden alle funktionieren:

  1. <month>/<day>
  2. <month>-<day>
  3. <day>.<month>

Wenn es keine Mehrdeutigkeit gibt, nämlich <day>größer als 12, spielt die Reihenfolge <month> <day>keine Rolle, und das Trennzeichen kann eines von ' /', ' -' oder ' .' sein.

Verwenden Sie andernfalls ' .' als Trennzeichen für <day>.<month>und ' /' oder ' -' für <month>-<day>.

" 1.7" Würde also als "1. Juli" behandelt und " 1/7" als "7. Januar".

Siehe das zugehörige Commit aus Version 1.3.0 :

Wenn das Trennzeichen '.' Ist, bevorzugen wir dd.mm.yyyy gegenüber
mm.dd.yyyy; Andernfalls hat MM / TT / JJ [JJ] Vorrang vor
DD / MM / JJJJ].

Dies gilt auch für andere Befehle, die eine Datumseingabe akzeptieren, z. B.: Protokoll seit dem 4. Februar anzeigen:

git log --since 2/4
Ryenus
quelle