チケット名が
[HOGE-BAR]FUGA
から
[HOHO-MIMI]FUGA
に変わる時
ちまちま変えるのダルい。
git-filter-repo
使う
インストール
pip install git-filter-repo
以下でやる。
git filter-repo --message-callback '
return message.replace(b"[HOGE-BAR]FUGA", b"[HOHO-MIMI]FUGA")
'
このエラーが出る。
git filter-repo --message-callback '
return message.replace(b"[HOGE-BAR]FUGA", b"[HOHO-MIMI]FUGA")
'
Aborting: Refusing to destructively overwrite repo history since
this does not look like a fresh clone.
(expected freshly packed repo)
Please operate on a fresh clone instead. If you want to proceed
anyway, use --force.
このエラーメッセージは、git filter-repoがリポジトリの履歴を書き換える際に、安全な操作であることを確認するために出されます。具体的には、git filter-repoは既存のリポジトリで操作することを防ぐため、クリーンなクローンで作業することを推奨しています。
理由
git filter-repoは、リポジトリの履歴を大幅に変更する強力なコマンドであり、履歴を完全に書き換えてしまうため、通常の開発作業で使っているリポジトリに対して実行すると、データの損失やチームでの作業に支障をきたす可能性があります。そこで、クリーンなクローン(新しいクローン)で作業することが推奨されています。
解決方法
リポジトリのクローンを新たに作成してから、git filter-repoを実行するか、もし元のリポジトリで作業を強行したい場合は、--forceオプションを付けて実行できます。
方法1: クリーンなクローンを作成してから実行
まず、リポジトリを新たにクローンします。
git clone <リポジトリのURL>
方法2: --forceオプションを使って強制的に実行
git filter-repo --force --message-callback '
return message.replace(b"[HOGE-BAR]FUGA", b"[HOHO-MIMI]FUGA")
'
git filter-repo --refs refs/heads/main --path myfile.txt --refs $(git rev-list HEAD~10..HEAD) --message-callback '
return message.replace(b"[HOGE-BAR]FUGA", b"[HOHO-MIMI]FUGA")
'
ブランチ名、コミット範囲、特定ファイルを同時に指定する方法
git filter-repo --refs refs/heads/main --path myfile.txt --refs $(git rev-list HEAD~10..HEAD) --message-callback '
return message.replace(b"[HOGE-BAR]FUGA", b"[HOHO-MIMI]FUGA")
'
オプションの説明
--refs refs/heads/main: mainブランチを指定します。対象となるブランチを特定できます。
--path myfile.txt: 特定のファイル(ここではmyfile.txt)に限定して操作を行います。
--refs $(git rev-list HEAD~10..HEAD): コミット範囲を指定します。HEAD~10からHEADまでのコミットを対象にしています。
--message-callback: コミットメッセージの置換を行うスクリプトです。
ブランチ名、コミット範囲、強制適用を同時に指定する方法
git filter-repo --refs $(git rev-list HEAD~10..HEAD) --refs refs/heads/main --force --message-callback '
return message.replace(b"[HOGE-BAR]FUGA", b"[HOHO-MIMI]FUGA")
'
オプションの説明
--refs $(git rev-list HEAD~10..HEAD): コミット範囲を指定します。HEAD~10からHEADまでの範囲。
--refs refs/heads/main: mainブランチを指定します。
--force: このオプションは、git filter-repoが通常は安全のために中止するような状況(既存のリポジトリに変更を加える場合など)で強制的に実行させるために使用します。
--message-callback: コミットメッセージを置換するスクリプトです。
--refs $(git rev-list HEAD~10..HEAD): コミット範囲を指定します。HEAD~10からHEADまでの範囲。
は意味なさそう
git filter-repo --refs refs/heads/main --force --message-callback '
return message.replace(b"[HOGE-BAR]FUGA", b"[HOHO-MIMI]FUGA")
'
がいいかも? main
のところを適宜変える。