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?
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'
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.
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".
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
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!
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
.
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.
git commit --amend --date="now"
Cela change la date (timestamp) du dernier commit
git commit --amend --date "Thu May 28 18:21:46 2015 +0530"
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! .
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!"
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]
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"
}
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"
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.
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:
^
), mais je n’ai pas réussi.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.
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
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