結論は、エラーに表示された絶対パスが自分で管理するリポジトリかを確かめ、現在の利用者とフォルダー所有者を比較したうえで、信頼できる場合だけその1パスをsafe.directoryへ登録することです。原因が分からないまま例外を増やしたり、すべてのリポジトリを安全扱いにしたりしないでください。なお、この警告は「ファイルへ書き込めない」といった通常の権限不足とは別の確認です。
なぜGitが処理を止めるのか
Gitは既定で、現在の利用者とは異なる所有者のリポジトリについて、設定ファイルの解析やフックの実行を拒否します。safe.directoryは、意図的に共有するなど、所有者が異なっていても信頼すると判断したリポジトリを例外登録する多値設定です。詳しい仕様はGit公式のsafe.directoryの説明で確認できます。
登録前に、エラーへ表示された絶対パスが、コピー元や古い作業フォルダーではなく、想定しているプロジェクトそのものかを確認します。管理者としてGitを実行し続ける方法、再帰的なACL変更、所有者の一括変更を先に試すのは避けます。会社の共有PCや共同管理のリポジトリなら、自分の判断だけで所有者を変えず、管理者へ運用を確認してください。
利用者・所有者・既存設定を確認する
PowerShellは、問題のリポジトリの外にあるフォルダーで開きます。問題の中から設定一覧を読もうとすると、local設定の解析段階で再び拒否される場合があるためです。最初にGitのバージョンを記録します。
git --version次に、現在のWindows利用者を確認します。whoamiは現在のユーザー名を表示するWindowsコマンドです。公式のwhoami資料も参照できます。
whoami続いて、エラーに表示されたフォルダーの所有者を確認します。次のC:\work\projectは説明用の架空パスなので、自分の絶対パスへ置き換えてください。Get-Aclはフォルダーなどのセキュリティ記述子を取得し、Ownerを確認できます。詳細はMicrosoft公式のGet-Acl資料にあります。
Get-Acl -LiteralPath 'C:\work\project' | Select-Object Ownerwhoamiの結果とOwnerが違っていても、それだけで不正とは限りません。別アカウントで作成した、管理者が展開した、共有運用しているなどの理由を確認します。正しいパスか、所有者が違う理由は説明できるか、自分または組織が信頼している内容か、の3点を判断できない場合は設定を追加しません。
次に、既存のsafe.directoryを確認します。show-originを付けると設定元も確認できます。設定が見つからないときの非ゼロ終了だけで、別の原因だと決めつけないでください。
git config --show-origin --get-all safe.directory
信頼できる1パスだけを登録する
確認したリポジトリだけを例外へ加えます。既存の別パスを消さないため、global設定へaddで追加します。safe.directoryはprotected configurationでのみ有効なため、拒否されたリポジトリ自身のlocal設定へ書く方法は解決策にしません。
git config --global --add safe.directory 'C:/work/project'この登録はGitの所有者チェックに対する例外を追加するだけで、フォルダーの所有者やファイルの読み書き権限そのものは変えません。また、全リポジトリや配下全体を許可する指定もありますが、影響範囲が広いため、ここでは個別の絶対パスだけを使います。
この記事では幅広く使われてきた従来形式に構文を統一しています。現行のgit-config公式資料はget、set、unsetの新しいサブコマンドを推奨し、従来形式をdeprecated modeとして説明しています。新旧構文を混在させず、運用環境で採用する形式をそろえてください。
statusで結果を確かめ、不要なら対象値だけ戻す
登録後は、作業場所を移動せず、-Cで対象リポジトリを指定してstatusを実行します。ここで確認するのは、dubious ownershipの拒否が解消したかと、指定したパスが意図したリポジトリかです。別のエラーが出た場合は、その内容を新しい原因として切り分けます。
git -C 'C:/work/project' status例外が不要になったら、まず設定一覧を再確認し、削除対象の値が意図したパスと一致することを確かめます。そのうえで、固定文字列として一致する対象値だけを取り消します。同じ値が複数登録されている場合は一致分がすべて外れるため、実行前の一覧確認が重要です。
git config --global --fixed-value --unset-all safe.directory 'C:/work/project'最終点検は、絶対パスが正しいこと、所有者が違う理由を説明できること、既存の別の例外を残していること、statusで対象リポジトリを確認したことの4点です。判断材料が足りない場合は、safe.directoryを増やすより先に、リポジトリの作成元や共有ルールを確認してください。


コメント