GitHub Actions:「fatal: detected dubious ownership in repository」
git は、ほかのユーザーのディレクトリにあるリポジトリを使うのを断ります。GitHub のホストランナーではチェックアウトはランナーのユーザーのものなので、ステップが別のユーザーで git を動かすときに出ます。コンテナの中の root、Docker のアクション、セルフホストランナーのサービスのアカウントです。actions/checkout は例外を自分のためだけに設定するので、checkout のステップは通り、次の git のコマンドが失敗します。
見え方
fatal: detected dubious ownership in repository at '/__w/octo-repo/octo-repo' To add an exception for this directory, call: git config --global --add safe.directory /__w/octo-repo/octo-repo Error: Process completed with exit code 128.
ほかの道具は、同じ行のまわりを自分の言葉で包みます。gh は「failed to run git: fatal: detected dubious ownership」、Composer は、リポジトリが「does not have the correct ownership and git refuses to use it」(持ち主が正しくなく、git が使うのを断る)と言います。
checkout が次のステップを守らない理由
set-safe-directory は既定で有効ですが、actions/checkout はそれを一時的なホームディレクトリのグローバル設定に書きます。ログには「Temporarily overriding HOME='…' before making global git config changes」と出て、ソースはそのディレクトリをあとで消します。次のステップは本当の HOME を使い、そこに例外はありません(goabonga cloud #125・sast-benchmarks #18)。
1. container: のあるジョブ
/__w の下のワークスペースはランナーのユーザーのもので、たいていのイメージはステップを root で動かします。あるパイプラインでは、コンテナの9本が git tag --list で失敗し、同じコンテナのほかの9本は、checkout のあとに git を使っていなかったので通っただけでした(goabonga cloud #125)。checkout のあと、最初の git のコマンドの前に、例外を1回足します:
jobs:
release:
runs-on: ubuntu-latest
container: node:22-bookworm
steps:
- uses: actions/checkout@v7
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: git describe --tags
actions/checkoutを使わずに clone するとき(Node.js の無いイメージなど)は、clone の前に要ります(nexus #1)。- 1つのコマンドだけなら
git -c safe.directory="$PWD" statusでも通ります。この設定はグローバル・システム・コマンドラインの設定からだけ読まれ、リポジトリの.git/configからは読まれません。 safe.directory '*'は、すべてのリポジトリで確認をやめます。使い捨てのコンテナなら構いませんが、フォークのプルリクエストをチェックアウトするセルフホストのマシンでは勧めません。
2. Docker のアクション、またはワークスペースをマウントした docker run
- Docker のコンテナのアクションは、ワークスペースを
/github/workspaceで受け取り、たいてい root で動きます。psalm-github-actions はcomposer installのエラーをイメージの中で直しました(#72)。使っているアクションでこれが出るなら、版を上げます。作っている側なら、エントリーポイントで例外を足します。 - ステップの中の
docker run -v "$PWD":/srcは、ランナーのユーザーのディレクトリの上で root として動き、ランナー側の git の設定はコンテナの中にはありません(agyloop #352)。-u "$(id -u):$(id -g)"で自分のユーザーとして動かすか、コンテナの中で例外を足します。
3. ステップが別のアカウントで動くセルフホストランナー
ある Windows のランナーでは、チェックアウトは設定した人のユーザーのもので、ステップは NETWORK SERVICE で動いていたので、gh release create が C:/actions-runner/_work/… で失敗しました(ocgp-godot-tps-bench #8)。ランナーのサービスを作業フォルダーの持ち主のアカウントで動かすか、ジョブで例外を足します。セルフホストランナーでのコンテナのジョブは 1 と同じです(sast-benchmarks #18)。
ジョブは失敗しないまま壊れることがある
git のエラーが隠れると、ジョブは緑のまま間違った答えを出します。2>/dev/null と || を使ったデプロイの見張りは、コミットが無いと報告し(CellarNode .github #48)、コンテナのジョブの差分のチェックは一度も差分を見つけませんでした(#237)。実行が通っていても、ログで「dubious ownership」を探します。CellarNode は GIT_TEST_ASSUME_DIFFERENT_OWNER=1 で手元で再現しました。
見分け方
- 「fatal: not a git repository (or any of the parent directories): .git」:ステップが動く場所にチェックアウトが無いか、
working-directoryが別の場所を指しています。 - 「could not read Username for 'https://github.com'」:git はリポジトリを使えて、そのあとリモートへの資格情報がありませんでした。
- この確認は 2022年4月の Git 2.35.2 から始まりました。イメージや道具の更新のあとに出たなら、たいていは git がまた変わったのではなく、何かが別のユーザーで動くようになったのです。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Git は Software Freedom Conservancy の商標、Docker は Docker, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Software Freedom Conservancy・Docker, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「could not read Username for 'https://github.com'」 · git push の「Permission to ... denied to github-actions[bot]」 · 「No space left on device」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English