commit した日時を変更
commit した日時を変更する
変更したい理由
AtCoder
で、コードを提出した後に commit
し忘れることがある。
commit
した日時を提出した日時に変更したい。
指定した日時に commit した日時を変更
下記のブログの内容を参考に使いやすいように調整しました。
調整内容
- 引数がないときは、何もしない
main
かmaster
ブランチのときは、何もしない- 作業中でも日時を変更できる
コード
dotfiles/zsh/.my_functions/.giso.zshrc
# アリバイ工作
# * [Gitでアリバイ工作するスクリプトはコチラです - 銀の弾丸](https://takamints.hatenablog.jp/entry/and-then-you-disguise-the-authored-date)
#
# REPLACE_DATE: 書き換える日時
# * 例 '2021-08-15 20:30:00'
function giso() {
# デフォルトブランチのときは、終了する
local CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [[ $CURRENT_BRANCH =~ ^(main|master|develop|development)$ ]]; then
echo "Error: please change from the ${CURRENT_BRANCH}"
return 1
fi
[[ $# < 1 ]] && echo "$0 <%Y/%m/%d %H:%M:%S>" && return 1
local REPLACE_DATE=$1
# 変更途中のものを stash する
git stash save -u > /dev/null
# AuthorDate を書き換え
git commit --amend -C HEAD --date="${REPLACE_DATE}" 1>/dev/null
# CommitDate を書き換え
git rebase HEAD~ --committer-date-is-author-date 1>/dev/null
# stash したのを戻す
git stash pop > /dev/null
}
使い方
$ pwd
/Users/username/dotfiles
# zsh/.my_functions/.giso.zshrc の読み込み
$ source zsh/.my_functions/.giso.zshrc
# AuthorDate, CommitDate の確認
$ git log --pretty=fuller
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
commit 4cfd1e9d81699f70ea039b4c0291913eea63be68 (HEAD -> feature/giso) ┃
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻
Author: username <[email protected]>
AuthorDate: Sun Aug 15 22:03:43 2021 +0900
Commit: username <[email protected]>
CommitDate: Sun Aug 15 22:03:43 2021 +0900
:sparkles: Fix giso
# アリバイ工作(今回作ったコマンド)
$ giso '2021-08-15 22:00:00'
# AuthorDate, CommitDate が '2021-08-15 22:00:00' に変わっているのを確認
$ git log --pretty=fuller
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
commit 7956951f5fabdbb2ff0cc450fde4c0d4686d30eb (HEAD -> feature/giso) ┃
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻
Author: username <[email protected]>
AuthorDate: Sun Aug 15 22:00:00 2021 +0900
Commit: username <[email protected]>
CommitDate: Sun Aug 15 22:00:00 2021 +0900
:sparkles: Fix giso
学び
AuthorDate と CommittDate
$ git commit --amend
すると、ComitterDate
が更新した日時になる。
# AuthorDate, CommitDate の確認
$ git log --pretty=fuller
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
commit ae2febf8df97cd7b20ae111dad48f4147d71cdbe (HEAD -> feature/giso) ┃
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻
Author: username <[email protected]>
AuthorDate: Sun Aug 15 21:31:46 2021 +0900
Commit: username <[email protected]>
CommitDate: Sun Aug 15 21:31:46 2021 +0900
:recycle: Refactor giso
# AuthorDate のみ変更
$ git commit --amend -C HEAD --date='2021-08-15 21:31:00'
[feature/giso ebd6896] :recycle: Refactor giso
Date: Sun Aug 15 21:31:00 2021 +0900
1 file changed, 1 insertion(+)
# 現在時刻の確認
$ date
日 8 15 21:43:02 JST 2021
# AuthorDate が指定した時間に、CommitDate が更新した日時に変わっているのを確認
$ git log --pretty=fuller
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
commit d77d765d4824c6d1361621fe7e6dbe3042743852 (HEAD -> feature/giso) ┃
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻
Author: username <[email protected]>
AuthorDate: Sun Aug 15 21:31:00 2021 +0900
Commit: username <[email protected]>
CommitDate: Sun Aug 15 21:42:57 2021 +0900
:recycle: Refactor giso
自分が今いるブランチを確認
# ブランチを確認
$ git branch --contains
* feature/giso
# * を消せる
$ git branch --contains | cut -d " " -f 2
feature/giso
# 今回はこちらを使いました
$ git rev-parse --abbrev-ref HEAD
feature/giso
偽装したくないブランチのときは、終了
master ブランチでコレやって、push -f とかしちゃったら、市中引き回しの上獄門ですから気をつけて。
push -f
してしまいそうなので、main
, master
, develop
, development
ブランチのときは、何も実行せずに終了する。
local CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [[ $CURRENT_BRANCH =~ ^(main|master|develop|development)$ ]]; then
echo "Error: please change from the ${CURRENT_BRANCH}"
return 1
fi
標準出力を捨てる
$ git stash
の標準出力を > /dev/null
で捨てる。
他に作業中のファイルがあっても、giso
コマンドは使いたいので、stash
で一旦退避させてから戻す。
# 変更途中のものを stash する
git stash save -u > /dev/null
# 略
# stash したのを戻す
git stash pop > /dev/null
標準エラー出力のみを表示
1>/dev/null
で、標準エラー出力のみを表示できる。
# AuthorDate を書き換え
git commit --amend -C HEAD --date="${REPLACE_DATE}" 1>/dev/null
# CommitDate を書き換え
git rebase HEAD~ --committer-date-is-author-date 1>/dev/null