I have that script in my path, called git-rcd
, which changes GIT_COMMITTER_DATE
and GIT_AUTHOR_DATE
of any commit you want (not just the last one)
#!/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")
echo "datecal=$datecal => date_timestamp=$date_timestamp date_r=$date_r"
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"
What that allows me is take the last commit I just did and type:
git rcd @ '1 day ago'
And presto! My last commit has now been done yesterday.
It changes any commit you want:
git rcd @~2 '1 day ago'
That would only change the HEAD~2
(and not the HEAD~
or HEAD
)
The script works even on Windows.
Once the change is done, push (or git push --force
if you pushed before with the wrong date). And your streak is preserved.
Note (2020), David Fullerton mentions in the comments:
Getting this working on Mac OS X required:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…