hene

hene.dev

commit した日時を変更

commit した日時を変更する

変更したい理由

AtCoder で、コードを提出した後に commit し忘れることがある。 commit した日時を提出した日時に変更したい。

指定した日時に commit した日時を変更

下記のブログの内容を参考に使いやすいように調整しました。

調整内容

  • 引数がないときは、何もしない
  • mainmaster ブランチのときは、何もしない
  • 作業中でも日時を変更できる

コード

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 とかしちゃったら、市中引き回しの上獄門ですから気をつけて。

Git でアリバイ工作するスクリプトはコチラです - 銀の弾丸

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

参考

関連記事