Skip to content

Gitの「unsafe repository」エラーと解決方法

問題の概要

Git 2.35.2以降のセキュリティアップデートにより、異なるユーザーによって所有されているリポジトリでGitコマンドを実行すると、以下のエラーが発生するようになりました:

fatal: unsafe repository ('/home/repon' is owned by someone else)

この問題は、Webサーバー(Apacheのwww-dataユーザーなど)がGitリポジトリにアクセスする場合や、sudoを使用してGitコマンドを実行した場合などに頻繁に発生します。

エラーの背景

この新しいセキュリティ制限は、Gitのセキュリティ脆弱性に対応するために導入されました。Gitは現在、現在のユーザーが所有していないリポジトリでの操作をデフォルトで禁止しており、明示的な許可が必要です。

解決方法

方法1: 安全なディレクトリとして明示的に指定

特定のディレクトリを安全としてマークする:

bash
git config --global --add safe.directory /path/to/your/repository

方法2: すべてのディレクトリを許可(注意が必要)

セキュリティ上の注意

この方法はすべてのGitリポジトリを安全とみなすため、セキュリティリスクがあります。必要な場合のみ使用してください。

bash
# Bashの場合
git config --global --add safe.directory '*'

# PowerShellの場合
git config --global --add safe.directory *

方法3: システム全体の設定

すべてのユーザーに対してリポジトリを安全として設定:

bash
sudo git config --system --add safe.directory /path/to/repository

方法4: ファイルの所有権を変更

リポジトリの所有権を現在のユーザーに変更:

bash
sudo chown -R username:group /path/to/repository

方法5: Webサーバー用の設定

Apacheのwww-dataユーザー用に設定する場合:

bash
# www-dataユーザーのgitconfigを作成
sudo -u www-data git config --global --add safe.directory /path/to/repository

または、システム全体の設定ファイル(/etc/gitconfig)に直接追加:

ini
[safe]
    directory = /path/to/repository

プラットフォーム別の注意点

Windowsの場合

Windowsでの詳細な解決手順
  1. エクスプローラーでリポジトリフォルダを右クリック
  2. 「プロパティ」→「セキュリティ」→「詳細設定」を選択
  3. 「所有者」を現在のユーザーに変更
  4. 権限の適用を待つ

またはコマンドラインで:

cmd
takeown /f . /r /d Y

WSL (Windows Subsystem for Linux) の場合

.gitconfigファイルを直接編集:

ini
directory = %(prefix)///wsl$/Ubuntu-version/path/to/repository

自動化環境での対応

JenkinsなどのCI/CD環境では、ワークスペースを安全なディレクトリとして自動的に追加:

groovy
sh(label: 'Git config safedir', script: "git config --global --add safe.directory ${env.WORKSPACE}")

ベストプラクティス

  1. 最小権限の原則: 必要なリポジトリのみを安全なディレクトリとして追加
  2. 所有権の統一: 可能であれば、ファイルの所有権を統一する
  3. sudoの回避: 可能な限りsudoを使用せずにGit操作を実行
  4. 定期的な見直し: 安全なディレクトリの設定を定期的に見直す

トラブルシューティング

設定が反映されない場合:

  • 設定ファイルの権限を確認(~/.gitconfigまたは/etc/gitconfig
  • 複数回追加されている場合は重複を削除:
    bash
    git config --global --replace-all safe.directory '*'
  • ユーザーごとの設定を確認(特にWebサーバーユーザー)

まとめ

Gitの新しいセキュリティ制限は重要な保護機能ですが、適切に設定する必要があります。環境とセキュリティ要件に応じて最適な解決方法を選択してください。最も安全な方法は、必要なリポジトリのみを明示的に許可することです。