初めに
gitのリポジトリを載せてている環境があり、
Ansibleで環境を新しくサーバを構築したところなぜかgitの操作が通らずに失敗するようになった。
問題となっているのがgitだったのでサーバの中に入り確認したところ、
各種操作で以下のエラーが確認された。
$ git pull
fatal: detected dubious ownership in repository at '/xxx/xxx'
To add an exception for this directory, call:
git config --global --add safe.directory /xxx/xxx
以前同じ建て方をした環境では発生せずに新しく立てた環境のみ発生する事象であった。
原因
gitのバージョンが2.35.2以上でsafe.directory
パラメータの追加に関連する変更が起因だった。
https://git-scm.com/docs/git-config/2.35.2#Documentation/git-config.txt-safedirectory
成功している環境はgitのバージョンが2.32.0
だが今回建てた環境は2.37.1
でこのバージョンを跨いだため発生した。
なぜバージョンが違うのか後で確認したところアプリに直接関わるphp等のバージョンは固定していたが、
git等直接関わらない部分がインストールの指定の時に固定されていなかったので、
立てた時期の違いによってバージョンが異なってしまった。
対処方法
説明に記載の通りのコマンドを実行すれば解決する。
rootなど予期せぬユーザでgit pullをして新規ファイルの権限がrootで作成されてしまった...
ということがないようにめんどくさがって--system
で設定しない方が無難だと個人的には思う。
対象の環境はAnsibleでの構築かつ該当ユーザはそのリポジトリ一つしか取り扱わなかったので、
以下をAnsible側に追記することで解決。
- name: add safe directory
git_config:
name: safe.directory
scope: global
value: '/xxx/xxx' #リポジトリの配置先
gitのコマンド的には--add
を使うことで既存の設定に追加する形でパスを追加できるようですが、
Ansible側で分割上複数箇所で設定したい場合は何が正解となるのかは不明。
(--add
は既存のパラメータと同じ値が既にあっても追記する挙動のようです)
そのほかの解決はあるか?(要確認)
https://git-scm.com/docs/git-config/2.35.2#Documentation/git-config.txt-safedirectory
By default, Git will refuse to even parse a Git config of a repository owned by someone else
記載を見る限り所有者が他の場合に発生するもののような記載が見当たる。
ただ今回.gitフォルダの権限を確認し所有者で実行していることは確認しているのになぜか発生している。
一応リポジトリを配置している一つ下のディレクトリの所有者がroot:root
であったため、
権限を試しに今回リポジトリを設置するユーザに変更してみたがこれでもNGであった。
特定の開発環境などであれば個別にsafe.directory
を配置すれば良いと思うが、
開発PC等複数のリポジトリを持つ場合はどうするのが正解となるのだろうか(そもそも発生するのか)。
一応*
を指定することで全ディレクトリOKができる例がいくつか見つかったので、
開発PCでバージョンを上げて発生するのであれば最悪この対応をするか、
せめてリポジトリがまとめて配置してあるディレクトリは以下を指定するのがよさそうではある。
追記(同日)
手元の環境(macosx)でgitのバージョンを上げてみてgit操作をしてみたがこの事象は発生しなかった。
やはり権限等何かしらの要因がある可能性があるので解決可能ならそちらを解決するのが良いかもしれない。