574 votes

Comment peut-on modifier le timestamp d'une vieille s'engager dans Git?

Les réponses à cette question de décrire une façon de modifier la précédente livraison de messages qui n'ont pas encore été poussé en amont. Les nouveaux messages hériter le timestamp de l'original s'engage. Cela semble logique, mais est-il un moyen de re-définir la fois?

618voto

Paul Pladijs Points 3630

Vous pouvez faire un rebase interactif et choisissez modifier pour que la livraison dont la date que vous souhaitez modifier. Lorsque le processus de rebase s'arrête pour la modification de la validation que vous tapez par exemple:

git commit --amend --date="Wed Feb 16 14:00 2011 +0100"

Ensuite, vous continuez votre rebase interactif.

Mise à JOUR (en réponse au commentaire de studgeek): pour changer la validation date de la place de l'auteur date:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend

Les lignes au-dessus de définir une variable d'environnement GIT_COMMITTER_DATE qui est utilisé dans modifier commettre.

Tout est testé dans Git Bash.

424voto

Dustin Points 35205

l'utilisation de git filter-branch avec un env filtre qui définit GIT_AUTHOR_DATE et GIT_COMMITTER_DATE pour le hachage de la livraison, vous êtes à la recherche à résoudre.

Cela annulerait que dans le futur tous les tables de hachage.

Edité par exemple

Si vous souhaitez modifier les dates de commettre 119f9ecf58069b265ab22f1f97d2b648faf932e0,, vous pouvez le faire avec quelque chose comme ceci:

git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'

338voto

Luke Ehresman Points 1094

Une meilleure façon de gérer l'ensemble de ces suggestions en une seule commande est

GIT_COMMITTER_DATE="`date`" git commit --amend --date "`date`"

Cela sera le dernier commit commit et auteur date à "l'instant".

40voto

VonC Points 414372

Bâtiment sur theosp's réponse, j'ai écrit un script qui s'appelle git-cdc (pour changer la date commettre) que j'ai mis dans mon PATH.

Le nom est important: git-xxx n'importe où dans votre PATH vous permet de taper:

git xxx
# here
git cdc ... 

Ce script est en bash, même sur Windows (depuis Git sera appeler à partir de son msys de l'environnement)

#!/bin/bash
# commit
# date YYYY-mm-dd HH:MM:SS

commit="$1" datecal="$2"
temp_branch="temp-rebasing-branch"
current_branch="$(git rev-parse --abbrev-ref HEAD)"

date_timestamp=$(date -d "$datecal" +%s)
date_r=$(date -R -d "$datecal")

if [[ -z "$commit" ]]; then
    exit 0
fi

git checkout -b "$temp_branch" "$commit"
GIT_COMMITTER_DATE="$date_timestamp" GIT_AUTHOR_DATE="$date_timestamp" git commit --amend --no-edit --date "$date_r"
git checkout "$current_branch"
git rebase --committer-date-is-author-date "$commit" --onto "$temp_branch"
git branch -d "$temp_branch"

Avec cela, vous pouvez taper:

git cdc @~ 2014-07-04 20:32:45

Que serait réinitialiser auteur/validation de la date de la livraison avant de la TÊTE (@~) à la date spécifiée.

14voto

leden Points 1674

Voici un alias pratique que les changements à la fois s'engager et à la fois auteur de le dernier commit pour un temps accepté par date --date:

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && GIT_COMMITTER_DATE=\"$d\" \
            git commit --amend --date \"$d\""

Utilisation: git cd <date_arg>

Exemples:

git cd now  # update the last commit time to current time
git cd '1 hour ago'  # set time to 1 hour ago

Edit: Voici une plus-version automatique qui vérifie que l'indice est propre (pas de modifications non validées) et réutilise le dernier message de validation ou d'échec dans le cas contraire (épreuve):

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && \
        git diff-index --cached --quiet HEAD --ignore-submodules -- && \
        GIT_COMMITTER_DATE=\"$d\" git commit --amend -C HEAD --date \"$d\"" \
        || echo >&2 "error: date change failed: index not clean!"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: