Git Commit-Datum auf Author-Datum setzen (PowerShell)

Git Commit-Datum auf Author-Datum setzen (PowerShell)

17 Feb 2025 - Matthias Voigt

Beim Umschreiben von Git-Historien mit git rebase setzt Git das Commit-Datum (committer date) oft auf das aktuelle Datum, anstatt das ursprüngliche Author-Datum (author date) beizubehalten.

Beispiel für falsche Zeitstempel:

ce5666e | Author Date: Mon Feb 17 22:57:48 2025 | Commit Date: Mon Feb 17 23:27:05 2025
95c9ef7 | Author Date: Mon Feb 17 22:34:02 2025 | Commit Date: Mon Feb 17 23:27:05 2025

Hier wurde für mehrere Commits dasselbe Commit-Datum gesetzt, was die Historie verfälscht.

Lösung: Commit-Datum auf Author-Datum setzen

Da es in manchen Situationen sinnvoll sein kann, das richtige Commit-Datum zu haben, möchte ich hier eine Lösung mit Powershell vorstellen.

Einzelner Commit manuell korrigieren

Falls nur ein einzelner Commit betroffen ist:

# Hole das Author-Date als Unix-Timestamp
$authorDate = git show -s --format=%at HEAD | Out-String
$authorDate = $authorDate.Trim()

# Debug-Ausgabe zur Kontrolle
Write-Output "Using Author Date: $authorDate"

# Setze das Commit-Datum explizit
$env:GIT_COMMITTER_DATE = $authorDate
$env:GIT_AUTHOR_DATE = $authorDate

# Commit-Datum überschreiben
git commit --amend --no-edit --date="@${authorDate}"

# Falls ein Rebase läuft, fortsetzen
git rebase --continue

Mehrere Commits automatisch korrigieren

Falls mehrere Commits betroffen sind, kann dieses Skript helfen:

# Start-Commit definieren
$startCommit = "25aee03"

# Rebase starten
git rebase -i "$startCommit^"

# Liste der betroffenen Commits abrufen
$commits = git rev-list --reverse "$startCommit..HEAD"

foreach ($commit in $commits) {
    # Hole das Author-Date
    $authorDate = git show -s --format=%at $commit | Out-String
    $authorDate = $authorDate.Trim()

    # Debug-Ausgabe
    Write-Output "Fixing commit $commit with timestamp: $authorDate"

    # Setze das Commit-Datum
    $env:GIT_COMMITTER_DATE = $authorDate
    $env:GIT_AUTHOR_DATE = $authorDate

    # Commit überschreiben
    git commit --amend --no-edit --date="@${authorDate}"

    # Rebase fortsetzen
    git rebase --continue
}

# Änderungen hochladen
git push --force

Ergebnis

Nach der Ausführung des Skripts sind die Commit-Zeiten korrekt:

ce5666e | Author Date: Mon Feb 17 22:57:48 2025 | Commit Date: Mon Feb 17 22:57:48 2025
95c9ef7 | Author Date: Mon Feb 17 22:34:02 2025 | Commit Date: Mon Feb 17 22:34:02 2025

Jetzt stimmen die Commit-Daten mit den tatsächlichen Author-Daten überein.

Fazit

Dieses Vorgehen stellt sicher, dass bei einer Umschreibung der Git-Historie das Commit-Datum erhalten bleibt. Besonders unter PowerShell ist es wichtig, mit Unix-Timestamps zu arbeiten, um Formatierungsfehler zu vermeiden.

Wenn du bereits Commits gepusht hast, denk daran, dass du nach einer Änderung der Git-Historie mit git push --force arbeiten musst. Dies kann Auswirkungen auf andere Entwickler haben, die an demselben Repository arbeiten.

Das Skript bietet eine einfache Möglichkeit, fehlerhafte Commit-Zeiten zu korrigieren, ohne jeden Commit manuell zu bearbeiten.