Git
subtree

git のこと備忘録

個人的な git 関連の備忘録です。

コマンドとか

ログの AuthorName とか CommitterEmail とかを変更したいとき

歴史の改変です。

git filter-branch --commit-filter '
        if [ ! "$GIT_AUTHOR_NAME" = "●●●●" ];
        then
                GIT_COMMITTER_NAME="〇〇〇〇";
                GIT_AUTHOR_NAME="〇〇〇〇";
                GIT_COMMITTER_EMAIL="XXX@XXXX.com";
                GIT_AUTHOR_EMAIL="XXX@XXXX.com";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

これは内部ではrebaseとは異なる?動きをしているっぽいので、rebase中にコンフリクトが起きることがないので気持ち的には楽です。
ただし、1コミットづつ実行するので時間がかかります。
ただし、既にリモートへpush済みのブランチに対して変更後のものをpushするのはやばそう。

ログの AuthorDate と CommiterDate を同じにする

2通りの方法があるっぽいです。

1. filter-branch 使う版

上記と同じように filter-branch 使います。
特徴は、コンフリクトは起きないけどそれなりに時間がかかるってことでしょうか。

git filter-branch --env-filter \
  'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"' SHA1..HEAD

2. rebase する版

rebase により実行します。
特徴は、コンフリクトが起きる時があるけど、時間が早いことですかね。

git rebase --committer-date-is-author-date <コミット番号>

ここで、コミット番号を指定すると、そのコミットからHEADに向けて全てが対象となります。

そもそも、時間の変更くらいでコンフリクトが起きることはないのですが、自分の環境ではコンフリクトが起きる場合がありました。そのシチュエーションとは、例えばファイル名を大文字から小文字に変更するなどした場合です。コンフリクトが起きるというか、rebaseがエラーになります。たぶんWindowsが大文字と小文字を区別できないからなのかなとか思ってます。

ログの日付を変える

git commit --amend --date="Tue Jly 10 15:59:59 2018 +0900"