プッシュ済のコミットに対して一括で何らかの操作をしたい場合には、git filter-branch を使う。
以下に、ファイル一括操作 と コミット情報一括操作 について記述した。
ファイルの追加/削除
「全コミットから機密情報含むファイルを削除したい」場合は以下の手順でコマンド実行する。
この操作を行うことで、履歴が総書き換えされる。(→ハッシュが新しくなる)
前述の挙動の為、他メンバーが作業中の場合はローカルで保持している変更を全てプッシュしてもらう必要がある。
また、作業する際にはそれ用に別途クローンし、そこでするのがよいと思います。
1. filter-branchコマンド
-
''内に各コミットに対して適用するgitコマンドを指定する。今回はファイル削除するコマンドを指定している。
-
<対象コミット>には コミットを特定する記述(HEAD~ とか HEAD など..)を指定する。未指定の場合はチェックアウトブランチが対象になる。
-
複数ブランチが対象の場合は<対象コミット>を変えて、複数回コマンドを実行すればよい?
git filter-branch -f --index-filter 'git rm <ファイルパス>' <対象コミット>
2. リモートにプッシュ
履歴書き換え後のチェックアウトブランチをプッシュする。
git push origin master -f
コミットユーザー情報など
「業務用アカウントで個人開発用リポジトリにコミット・プッシュしてしまった際の修正として、一括書き換えを行う。」などの修正操作。
基本的な流れは、ファイルの追加/削除 と変わらない。
1. filter-branchコマンド
git filter-branch -f --commit-filter '
GIT_AUTHOR_NAME="<Author名>";
GIT_AUTHOR_EMAIL="<メールアドレス>";
git commit-tree $@;' <対象コミット>
2. リモートにプッシュ
git push origin master -f
全ブランチを一括操作対象とする
git filter-branchコマンドに --all オプションをつけると全ブランチに対して処理が行われる。