web-dev-qa-db-fra.com

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

Les réponses à Comment modifier les validations existantes non traitées? décrivent un moyen de modifier les messages de validation précédents qui n'ont pas encore été envoyés en amont. Les nouveaux messages héritent des horodatages des commits d'origine. Cela semble logique, mais existe-t-il un moyen de redéfinir les horaires?

650
Dhskjlkakdh

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

Cela invalidera cela et tous les hachages futurs.

Exemple:

Si vous voulez changer les dates de commit 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'
486
Dustin

Vous pouvez créer une base interactive et choisir éditer pour le commit dont vous souhaitez modifier la date. Lorsque le processus de rebase s’arrête pour modifier le commit que vous tapez, par exemple:

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

Ensuite, vous continuez votre rebase interactive.

UPDATE (en réponse au commentaire de studgeek): pour changer la date de validation au lieu de la date de l'auteur:

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

Les lignes ci-dessus définissent une variable d'environnement GIT_COMMITTER_DATE qui est utilisée dans amend commit.

Tout est testé dans Git Bash.

693
Paul Pladijs

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 de validation et de l'auteur du dernier commit sur "maintenant".

361
Luke Ehresman

Il suffit de faire git commit --amend --reset-author --no-edit. Pour les validations plus anciennes, vous pouvez créer une base interactive et choisir edit pour la validation dont vous souhaitez modifier la date.

git rebase -i <ref>

Puis modifiez le commit avec --reset-author et --no-edit pour changer la date de l'auteur à la date du jour:

git commit --amend --reset-author --no-edit

Enfin, continuez avec votre base interactive:

git rebase --continue
156
Miguel de Val-Borro

J'ai écrit un script et un package Homebrew pour cela. Super facile à installer, vous pouvez le trouver sur la page GitHub PotatoLabs/git-redate .

Syntaxe:

_git redate -c 3
_

Vous devez juste exécuter _git redate_ et vous pourrez éditer toutes les dates dans vim des 5 derniers commits (il existe également une option _-c_ pour le nombre de commits que vous voulez revenir en arrière, il juste défaut à 5). Faites-moi savoir si vous avez des questions, des commentaires ou des suggestions!

enter image description here

103
Edmund

Chaque commit est associé à deux dates, la date du committer et la date de l'auteur. Vous pouvez voir ces dates avec:

git log --format=fuller

Si vous souhaitez modifier la date de l'auteur et la date de création des 6 derniers commits, vous pouvez simplement utiliser une base interactive:

git rebase -i HEAD~6

.

pick c95a4b7 Modification 1
pick 1bc0b44 Modification 2
pick de19ad3 Modification 3
pick c110e7e Modification 4
pick 342256c Modification 5
pick 5108205 Modification 6

# Rebase eadedca..5108205 onto eadedca (6 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using Shell
# d, drop = remove commit

Pour tous les commits pour lesquels vous souhaitez modifier la date, remplacez pick par edit (ou simplement e), puis enregistrez et quittez votre éditeur.

Vous pouvez maintenant modifier chaque commit en spécifiant la date de l'auteur et la date du committer au format ISO-8601:

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"

La première date est la date de validation, la seconde est la date de l'auteur.

Ensuite, passez au prochain commit avec:

git rebase --continue

Répétez le processus jusqu'à ce que vous modifiiez tous vos commits. Vérifiez votre progression avec git status.

79
Ortomala Lokni

En me basant sur theosp 's answer , j'ai écrit un script appelé git-cdc (pour la modification de la date de validation) 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 sous 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 auteur/validation de la validation avant HEAD (@~) à la date spécifiée.

git cdc @~ "2 days ago"

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


Ilya Semenov mentionne dans les commentaires :

Pour OS X, vous pouvez également installer GNU coreutils (brew install coreutils), l'ajouter à PATH (PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"), puis utiliser "2 days ago "syntaxe.

42
VonC
git commit --amend --date="now"
31
Harald Nordgren

Cela change la date (timestamp) du dernier commit

git commit --amend --date "Thu May 28 18:21:46 2015 +0530"

26
Nishant

s'il est précédent dernier commit.

git rebase  -i HEAD~2
git commit --amend --date=now

si vous appuyez déjà sur l’origine et pouvez forcer l’utilisation:

git Push --force 

si vous ne pouvez pas forcer le Push et si vous le faites, vous ne pouvez pas changer le commit! .

18
Sérgio

Voici un alias pratique qui modifie les temps de validation et d'auteur de la dernière validation en 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 version plus automatisée qui vérifie que l'index est propre (pas de modifications non validées) et qui réutilise le dernier message de validation, ou échoue autrement (indérogeable):

[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!"
15
eold

J'ai créé ce paquet npm pour changer la date d'anciens commits.

https://github.com/bitriddler/git-change-date

Exemple d'utilisation:

npm install -g git-change-date
cd [your-directory]
git-change-date

Vous serez invité à choisir le commit que vous souhaitez modifier, puis à entrer la nouvelle date.

Si vous souhaitez modifier une validation par hachage spécifique, exécutez la commande git-change-date --hash=[hash]

13
Kareem Elbahrawy

La fonction bash suivante modifiera l'heure de toute validation sur la branche en cours.

Faites attention à ne pas utiliser si vous avez déjà poussé le commit ou si vous utilisez le commit dans une autre branche.

# rewrite_commit_date(commit, date_timestamp)
#
# !! Commit has to be on the current branch, and only on the current branch !!
# 
# Usage example:
#
# 1. Set commit 0c935403 date to now:
#
#   rewrite_commit_date 0c935403
#
# 2. Set commit 0c935403 date to 1402221655:
#
#   rewrite_commit_date 0c935403 1402221655
#
rewrite_commit_date () {
    local commit="$1" date_timestamp="$2"
    local date temp_branch="temp-rebasing-branch"
    local current_branch="$(git rev-parse --abbrev-ref HEAD)"

    if [[ -z "$date_timestamp" ]]; then
        date="$(date -R)"
    else
        date="$(date -R --date "@$date_timestamp")"
    fi

    git checkout -b "$temp_branch" "$commit"
    GIT_COMMITTER_DATE="$date" git commit --amend --date "$date"
    git checkout "$current_branch"
    git rebase "$commit" --onto "$temp_branch"
    git branch -d "$temp_branch"
}
10
theosp

Pour changer la date de l'auteur et la date de validation:

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
9
Jan H

Si vous voulez obtenir la date exacte d'un autre commit (disons que vous redéfinissez une validation avec un commit et que vous voulez qu'il ait la date de la version d'origine pré-rebase):

git commit --amend --date="$(git show -s --format=%ai a383243)"

Ceci corrige la date du HEAD commit à être exactement la date de commit a383243 (inclure plus de chiffres s'il y a des ambiguïtés). Une fenêtre d’éditeur s’affiche pour vous permettre de modifier le message de validation.

C’est pour la date de l’auteur, qui est ce qui vous tient à coeur habituellement - voir les autres réponses pour la date du committer.

8
Mr_and_Mrs_D

Si vous souhaitez exécuter la réponse acceptée ( https://stackoverflow.com/a/454750/72809 ) en ligne de commande Windows standard, vous avez besoin de la commande suivante:

git filter-branch -f --env-filter "if [ $GIT_COMMIT = 578e6a450ff5318981367fe1f6f2390ce60ee045 ]; then export GIT_AUTHOR_DATE='2009-10-16T16:00+03:00'; export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; fi"

Remarques:

  • Il peut être possible de fractionner la commande sur plusieurs lignes (Windows prend en charge le fractionnement de ligne avec le symbole carret ^), mais je n’ai pas réussi.
  • Vous pouvez écrire des dates ISO, gagner beaucoup de temps à trouver le bon jour de la semaine et créer une frustration générale quant à l'ordre des éléments.
  • Si vous souhaitez que les dates d'auteur et de commité soient identiques, vous pouvez simplement référencer la variable précédemment définie.

Un grand merci à billet de blog de Colin Svingen . Même si son code ne fonctionnait pas pour moi, il m'a aidé à trouver la solution correcte.

5
Peter

Il y a déjà beaucoup de bonnes réponses, mais lorsque je souhaite changer de date pour plusieurs commits en un jour ou en un mois, je ne trouve pas de réponse correcte. Donc, je crée un nouveau script pour cela avec explaintion, j'espère que cela aidera quelqu'un:

#!/bin/bash

# change GIT_AUTHOR_DATE for commit at Thu Sep 14 13:39:41 2017 +0800
# you can change the data_match to change all commits at any date, one day or one month
# you can also do the same for GIT_COMMITTER_DATE

git filter-branch --force --env-filter '

date_match="^Thu, 14 Sep 2017 13+"              

# GIT_AUTHOR_DATE will be @1505367581 +0800, Git internal format 
author_data=$GIT_AUTHOR_DATE;                   
author_data=${author_data#@}                  
author_data=${author_data% +0800}                # author_data is 1505367581     

oneday=$((24*60*60))

# author_data_str will be "Thu, 14 Sep 2017 13:39:41 +0800", RFC2822 format
author_data_str=`date -R -d @$author_data`      

if [[ $author_data_str =~ $date_match ]];
then
    # remove one day from author_data
    new_data_sec=$(($author_data-$oneday))
    # change to git internal format based on new_data_sec
    new_data="@$new_data_sec +0800"             
    export GIT_AUTHOR_DATE="$new_data"
fi
' --tag-name-filter cat -- --branches --tags

La date sera changée:

AuthorDate: Wed Sep 13 13:39:41 2017 +0800
1
detective0922

Si commit n'applique pas encore, je peux utiliser quelque chose comme ça: git commit --amend --date = "mer 25 mars 10:05:44 2020 +0300" après que git bash ouvre l'éditeur avec la date déjà appliquée, il ne vous reste plus qu'à pour le sauvegarder en tapant dans le mode de commande de l'éditeur de VI ": wq" et vous pouvez le pousser

0
Alex Tsumarau