immwind

长风

life, the programming and everything

filter-repoを使用して、gitのコミット履歴を変更する

数日前、あるプロジェクトで間違った 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

参考#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。