git.exe checkout master --
fatal: unsafe repository ('//wsl.localhost/Ubuntu/home/user1/my-project' is owned by someone else)
To add an exception for this directory, call:
git config --global --add safe.directory '%(prefix)///wsl.localhost/Ubuntu/home/user1/my-project'
gitは正常に終了しませんでした (終了コード 128) (281 ms @ 2022/04/20 22:30:48)
Gitを最新版にアップデートしたところ、TortoiseGitでコミットやブランチ切り替えをしようとするとexit status 128
エラーが表示されて処理を停止するようになりました。
解決方法
https://qiita.com/LemonmanNo39/items/e92ed9e3b9c812238006
まず前提として、上記の記事に書いてあるように、wsl側のホームディレクトリ内にプロジェクトを配置しているということ。ホスト側のエディタで編集するためにDockerのマウント対象にしているような使い方です。wsl本来の使い方に沿っているので、それ自体は問題ないです。でもこの使い方をしている人が今回のエラーに悩まされます。
TottoiseGitとwslを使っているということは、WindowsとwslそれぞれにGitがインストールされているということになります。TortoiseGitはWindows側のGit(git.exe)を使います。Windows側のGitでwsl側のGitリポジトリを操作しようとする。最新のGitでは、こういうことをするとエラーになります。
エラーメッセージに表示されているとおり、
git config --global --add safe.directory '%(prefix)///wsl.localhost/Ubuntu/home/user1/my-project'
上記をコピペで実行すれば解決です。ただしwsl側で実行するとwsl側の.gitconfigを更新してしまうため解決しません。 Windows側で実行する必要があります。普通にPowerShellを開けば「Windows側」です。
これにより.gitconfigファイルに設定が追加されます。気になる人は開いて確認してみてください。
なんでこんなエラーが出るようになったのかというと、セキュリティ上の理由だそうです。
https://gigazine.net/news/20220414-git-security-vulnerability/
(2022-04-22追記)Gigazineに記事が出てた。Windowsとかに限った話ではなく、管理をしっかりやってる環境は影響を受けそうです。でも理屈を理解すると納得という感じです。エラーメッセージに書いてあるとおりにするだけで解決するので、メッセージが英語でも慌てずに読むこと。
SourceTreeの場合は?
たぶんSourceTreeでも最新版をインストールした場合は同様の状態になると思います。SourceTreeのオプション設定を見たところ、SourceTreeをアップデートしても内蔵のGitはアップデートされないので、2020年4月以前からSourceTreeを使っている場合は影響を受けません。
Visual Studio Codeの場合 (2022-04-22追記)
そういえばwsl領域内でvscodeのGit関連の機能が動作しなくなってたのを思い出した。さっき見たら解決してました。今回の設定変更のおかげだと思います。
ChatGPTに聞いてみた (2024-02-14追記)
https://chat.openai.com/share/d4d018c1-c802-4db9-a304-4d5a13815776
当時ChatGPTがあればすぐ解決できた。