963 votes

Comment peut-on changer l'horodatage d'un ancien commit dans Git?

Les réponses à Comment modifier des commits existants et non poussés? décrivent une manière de modifier les messages de commit précédents qui n'ont pas encore été poussés en amont. Les nouveaux messages héritent des horodatages des commits originaux. Cela semble logique, mais y a-t-il un moyen de également réinitialiser les horaires?

0 votes

102 votes

git commit --amend --reset-author

0 votes

Le commentaire ci-dessus ^^ (@ErickM.Sprengel) devrait être la réponse acceptée. Facile à exécuter, surtout pour le dernier commit.

1000voto

Paul Pladijs Points 3630

Vous pouvez effectuer un rebase interactif et choisir edit pour le commit dont vous souhaitez modifier la date. Lorsque le processus de rebase s'arrête pour modifier le commit, vous saisissez par exemple :

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

P.S. --date=now utilisera l'heure actuelle.

Ensuite, vous poursuivez votre rebase interactif.

Pour changer la date du commit au lieu de la date de l'auteur :

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

Les lignes ci-dessus définissent une variable d'environnement GIT_COMMITTER_DATE qui est utilisée pour modifier le commit.

Tout est testé dans Git Bash.

23 votes

@nschum --date="" et --data"non-date-text" donnent tous deux le même résultat, prenant la date actuelle.

15 votes

Sur la version git 1.7.7.1 en utilisant --date="maintenant" donne fatal: format de date non valide: maintenant

5 votes

Lorsque le commit dont vous souhaitez modifier la date est le commit le plus récent, vous n'avez pas besoin de faire le rebase, vous pouvez simplement faire le git commit --amend

618voto

Dustin Points 35205

Utilisez git filter-branch avec un filtre d'environnement qui définit GIT_AUTHOR_DATE et GIT_COMMITTER_DATE pour le hachage spécifique du commit que vous souhaitez corriger.

Cela invalidera ce hachage ainsi que tous les hachages futurs.

Exemple :

Si vous voulez changer les dates du commit 119f9ecf58069b265ab22f1f97d2b648faf932e0, vous pourriez le faire avec quelque chose comme ceci :

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

7 votes

11 votes

Cela a trouvé la valeur correcte, mais définir simplement ces variables ne semblait en fait pas avoir d'impact sur la date de l'ancien commit.

47 votes

Que voulez-vous dire par "Cela invalidera celui-ci et tous les hachages futurs."?

442voto

Luke Ehresman Points 1094

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

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

Cela définira la date du commit et de l'auteur du dernier commit à "maintenant".

23 votes

Cela fonctionne très bien pour modifier des validations spécifiques lors d'un rébase interactif.

3 votes

Vous pourriez également ajouter un alias à l'interpréteur de commandes pour cela.

15 votes

Il semble que Git ne tienne pas compte du format de date de la localité, donc pour être complètement correct, vous devrez le faire quelque chose comme ceci : LANG= GIT_COMMITTER_DATE="`date`" git commit --amend --date "`date`"

47voto

VonC Points 414372

En s'appuyant sur la réponse de theosp, j'ai écrit un script appelé git-cdc (pour commit de changement de date) que j'ai placé dans mon PATH.

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

git xxx
# ici
git cdc ... 

Ce script est en bash, même sur Windows (puisque Git l'appellera depuis son environnement msys)

#!/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  --autostash --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"

Cela réinitialiserait la date de l'auteur/du commit du commit avant HEAD (@~) à la date spécifiée.

git cdc @~ "il y a 2 jours"

Cela réinitialiserait la date de l'auteur/du commit du commit avant HEAD (@~) à la même heure, mais 2 jours auparavant.


Ilya Semenov mentionne dans les commentaires:

Pour OS X, vous pouvez également installer les coreutils de GNU (brew install coreutils), les ajouter à votre PATH (PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") et ensuite utiliser la syntaxe "il y a 2 jours".

1 votes

Pour moi, cela n'a fonctionné qu'en citant la date et l'heure dans une seule citation : git cdc @~ "2014-07-04 20:32:45 sinon il ne reconnaîtrait pas l'heure et obtiendrait donc l'heure 00:00:00 (il devient le troisième argument).

3 votes

Pour OS X, vous pouvez également installer GNU coreutils (brew install coreutils), l'ajouter au PATH (PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") et ensuite utiliser la syntaxe "il y a 2 jours".

2 votes

@IlyaSemenov Intéressant. J'ai inclus votre commentaire dans la réponse pour plus de visibilité.

19voto

leden Points 1674

Voici un alias pratique qui modifie à la fois l'heure du commit et de l'auteur du dernier commit à un moment accepté par date --date:

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

Utilisation: git cd

Exemples:

git cd now  # mettre à jour l'heure du dernier commit à l'heure actuelle
git cd '1 hour ago'  # définir l'heure à il y a 1 heure

Éditer: Voici une version plus automatisée qui vérifie que l'index est propre (pas de changements non validés) et réutilise le dernier message de commit, sinon échoue (sécurité absolue):

[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 "erreur: échec de la modification de la date: l'index n'est pas propre!"

0 votes

Et l'auteur change, @eold?

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:

X