数日前、あるプロジェクトで間違った git メールアドレスを見つけました。今日は少し時間があるので、伝統的なスクリプトを使って修正しようと思いましたが、以下のようなメッセージが表示されました: "git-filter-branch には、歴史の書き換えに関する多くの落とし穴があります。中断するために Ctrl-C を押してから、git filter-repoなどの代替フィルタリングツールを使用してください。"。新しいコマンド (方法) があるので、試してみることにしました。
概要#
git-filter-repoは、[[Python]] で書かれた、[[git]] リポジトリの履歴をフィルタリングおよび変換するためのツールです。コミット履歴の削除、書き換え、リポジトリの分割など、さまざまな操作を行うことができます。
インストール#
macOS では、[[Homebrew|brew]] を使用してインストールできます:
brew install git-filter-repo
または、[[pip]] を使用してインストールすることもできます:
pip3 install git-filter-repo
もちろん、リポジトリからソースファイルを直接ダウンロードして実行することもできます。インストールすると、git コマンドと組み合わせて使用することができます。
使用方法#
ここでは、コミット履歴のメールアドレス情報を変更する方法について説明します:
git filter-repo --email-callback "return email.replace(b'old@email.com', b'new@email.com')"
別の方法として、メールアドレスと名前を同時に変更する方法もサポートされています (複数の場合):
git filter-repo --mailmap mailmap
mailmap ファイルの内容は次のようになります:
<new@email.com> <old@email.com>
new_name <new@email.com> old_name <old@email.com>
注:
- --mailmap では、**<>** 記号が必要です
- --email-callback と --mailmap の 2 つの方法では、メールアドレスの順序が異なります
変更が完了したら、push 時に「fatal: No configured push destination」というエラーメッセージが表示される場合は、まずリモートリポジトリを再設定する必要があります:
git remote add origin <url>
git push --set-upstream origin master -f
問題#
ローカルで変更して push した後、サーバーで pull を実行すると、次のようなメッセージが表示されます:
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # マージ (デフォルトのストラテジー)
hint: git config pull.rebase true # リベース
hint: git config pull.ff only # ファストフォワードのみ
hint:
hint: "git config"を"git config --global"に置き換えると、すべてのリポジトリにデフォルトの設定を行うことができます。また、--rebase、--no-rebase、--ff-onlyをコマンドラインで指定して、設定されたデフォルトを上書きすることもできます。
fatal: Need to specify how to reconcile divergent branches.
-fオプションを追加したり、メッセージの指示に従って操作を行っても解決しない場合は、.git ディレクトリを直接削除し、再度クローンしてからコピーすると、コミット履歴が一致するようになります。
情報#
環境#
- Python 3.10.10
- GitHub 2.39.2
- git-filter-repo 2.38.0
- システム: macOS 13.4.1