シナリオ:Gitの保護機能が過剰に働く場合それは一瞬のうちに起こります。Dockerコンテナ内やCI/CDパイプラインでビルドを実行し、スムーズなデプロイを期待している時です。ソースコードがマウントされ、環境が整い、git statusのような標準的なコマンドを実行します。しかし、ファイルリストが表示される代わりに、Gitはセキュリティ警告を出して停止します。
fatal: detected dubious ownership in repository at '/workspace'
これはランダムなバグではありません。Git v2.35.2で導入された、CVE-2022-24765を修正するためのセキュリティ機能です。この脆弱性は、悪意のある攻撃者が共有フォルダに不正な.gitディレクトリを配置することで、コードを実行できてしまうというものでした。現在、Gitは現在のユーザーが.gitフォルダを所有していないリポジトリへのアクセスを拒否します。
発生原因Gitは現在、厳格な所有権チェックを行います。一般的なDockerのセットアップでは、ホストユーザー(多くの場合UID 1000)が所有するローカルプロジェクトフォルダを、プロセスがroot(UID 0)として実行されるコンテナにマウントすることがあります。UIDが一致しないため、Gitはそのリポジトリを信頼できないと判断します。共有環境での潜在的な悪用を防ぐため、すべての操作をブロックするのです。
解決策1:特定のディレクトリを対象にする最も正確な解決方法は、特定のディレクトリが安全であることをGitに明示的に伝えることです。この方法により、プロジェクトのブロックを解除しつつ、他のすべてのディレクトリに対するセキュリティを維持できます。コンテナまたはランナー内で次のコマンドを実行してください。
git config --global --add safe.directory /workspace
/workspaceの部分は、エラーメッセージに表示された正確なパスに置き換えてください。このコマンドはグローバルな.gitconfigを更新し、そのパスに対して永続的な例外を作成します。
解決策2:CI/CD向けの包括的な設定自動化されたパイプラインでは、動的なパスや複数のサブモジュールが頻繁に使用されます。GitHub Actionsのランナーのような一時的な環境では、パスを一つずつホワイトリストに登録したくない場合があります。環境が隔離されており、ソースコードを信頼できる場合は、ワイルドカードを使用した修正方法を使用します。
git config --global --add safe.directory '*'
注意して使用してください。 '*'ワイルドカードは、短寿命で隔離された環境でのみ適用してください。セキュリティチェックを完全に無効にしてしまうため、複数のユーザーが存在する共有のプロダクションサーバーでは決して実行しないでください。
解決策3:DockerおよびCI設定への実装### Dockerfileの最適化設定をイメージに組み込むことで、手動での修正を避けることができます。これにより、そのイメージから起動されたすべてのコンテナで、すぐにGit操作が可能になります。
FROM alpine:3.18
RUN apk add --no-cache git
# 所有権エラーを避けるため、一般的なワークスペースパスを事前承認する
RUN git config --global --add safe.directory /app
WORKDIR /app
COPY . .
GitHub Actionsの効率化カスタムスクリプトやサードパーティのアクションが失敗する場合は、ワークフローの早い段階で設定ステップを挿入してください。実行には1秒もかからず、後続のステップでの失敗を防ぐことができます。
- name: ワークスペースを安全なディレクトリとしてマークする
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: ビルドメタデータを生成する
run: git describe --tags --always
解決策4:ファイルの所有権を変更するファイルの所有権を現在のユーザーに合わせることもできます。これはGitの設定を変更せずに問題を解決する「Linux流」の方法です。コンテナ内で以下を実行します。
chown -R $(id -u):$(id -g) /workspace
マウントされたボリュームに対してこれを行う前に、よく検討してください。Dockerは基盤となるファイルシステムを共有しているため、コンテナ内で所有権を変更すると、ホストマシン上でも変更されてしまいます。その結果、IDEやテキストエディタに戻ったときに「アクセス拒否(Permission Denied)」エラーが発生することがよくあります。
修正の確認アクティブな安全なディレクトリをすべてリスト表示して、Gitが変更を登録したことを確認します。次のコマンドを実行してください。
git config --global --get-all safe.directory
出力にパスまたは*記号が正しく表示されていれば、git statusやgit fetchコマンドが正常に動作するようになります。この修正は、環境内に~/.gitconfigファイルが存在する限り有効です。

