Gitの「cannot open .git/FETCH_HEAD: Permission denied」エラーの原因と解決策
Gitは、プロジェクトフォルダ内にある.git/ディレクトリ内のファイルへの書き込み権限を必要とします。Gitコマンドラインがこのフォルダにアクセスできない場合、git pullを実行した際に「error: cannot open .git/FETCH_HEAD: Permission denied」というエラーが発生します。
この記事では、このエラーの意味と発生原因を解説し、実際の例を通して具体的な修正方法を紹介します。
「cannot open .git/FETCH_HEAD: Permission denied」エラーとは
Gitリポジトリには、.git/という特別なフォルダが含まれています。このフォルダは隠しフォルダのため、普段は目にしないかもしれません。フォルダ名の先頭にピリオド(.)が付いていることが、隠しフォルダであることを示しています。
このフォルダには、リポジトリに関するさまざまなメタデータが格納されています。プロジェクト固有の設定オプション、ブランチなどの参照情報、現在のHEADなど、リポジトリ運用に不可欠な重要情報が含まれています。
Gitはこのフォルダへの読み取り・書き込みアクセスを必要とします。git configやgit pullなどのコマンドを実行するたびに、フォルダの内容が更新されるためです。
エラーが発生する具体例
ここでは、GitHubからck-gitというリポジトリをクローンするケースを見ていきましょう。このリポジトリにはREADME.mdというファイルが含まれています。リポジトリをクローンするには、git cloneコマンドを使用します。
sudo git clone https://github.com/Career-Karma-Tutorials/ck-git
現時点でのREADME.mdの内容は以下の通りです。
# ck-git
このファイルを、より説明的な内容に書き換えたいと思います。テキストエディタでファイルを開き、内容を次のように変更します。
# Career Karma Git Demo Career KarmaのGitチュートリアル用デモファイルを含むリポジトリです。
これで、ファイルがリポジトリの目的をより正確に説明できるようになりました。次に、コミットを作成できるよう、この変更をステージングエリアに追加します。
sudo git add README.md
Gitは、README.mdを次のコミットに含めることを認識します。変更をリモートリポジトリに反映させるには、コミットとして記録する必要があります。
sudo git commit -m "docs: Make README.md more descriptive"
これでコミットをリモートリポジトリにプッシュする準備が整いました。コードをプッシュする前に、まずリモート側の最新状態を取得しておきましょう。これにより、クローン後にリモートで行われた変更がないかを確認できます。
git pull
しかし、このコマンドは次のエラーを返します。
error: cannot open .git/FETCH_HEAD: Permission denied
このエラーは、Gitが内部ファイルの1つであるFETCH_HEADにアクセスできなかったことを意味しています。
解決策
今回のケースでは、sudoコマンドを使ってリポジトリをクローンしました。つまり、リポジトリはrootユーザーとしてクローンされたことになります。そのため、リポジトリ内のすべてのファイルの所有者がrootユーザーになっています。
ls -laコマンドを実行すると、この状況を確認できます。
total 8 drwxr-xr-x 4 root staff 128 Sep 17 07:15 . drwxr-xr-x+ 90 James staff 2880 Sep 17 07:15 .. drwxr-xr-x 12 root staff 384 Sep 17 07:15 .git -rw-r--r-- 1 root staff 1 Sep 17 07:15 README.md
フォルダ内のすべてのファイルが、「staff」グループに属する「root」ユーザーの所有物になっています。そのため、sudoを付けずにリモートリポジトリをプルしようとするとエラーが返されます。標準のユーザーアカウントには、フォルダ内のファイルを変更する権限がないためです。
この問題を解決するには、フォルダ内のファイルの所有権を自分のアカウントに変更します。chownコマンドを使用しましょう。
sudo chown -R james:staff .
このコマンドは、.git/フォルダを含むリポジトリ内のすべてのファイルとフォルダの所有権を一括で変更します(-Rオプションは再帰的に処理することを意味します)。これでディレクトリの所有者となり、プロジェクトフォルダへの完全なアクセス権を得られます。改めてコードをプルしてみましょう。
git pull
今度はコマンドが正常に実行され、次の出力が返されます。
Already up to date.
これで、前回コードを取得して以降、リモートリポジトリに変更がなかったことが確認できました。
まとめ
Gitの「Cannot open .git/FETCH_HEAD: Permission denied」エラーは、プロジェクトフォルダ内の.git/ディレクトリに現在のユーザーがアクセスできない状態で、リモートリポジトリからコードをプルしようとしたときに発生します。
このエラーを解決するには、chownコマンドなどを使って、作業中のGitリポジトリに対して現在のユーザーが読み書き権限を持っていることを確認してください。また、日常的なGit操作ではsudoを使わずに通常のユーザーで実行することが、この種の権限問題を未然に防ぐポイントです。
-
Gitリセットでコミットを取り消す!基本から実践テクニックまで徹底解説
個人でもチームでも、プロジェクトを進めていると「コミットを取り消したい」という場面に遭遇することがあります。そんなときに頼りになるのが git reset コマンドです。まさに命綱とも言えるツールの一つでしょう。 Gitの追跡メカニズム git reset を理解する前に、まずGitの内部構造について押さえておきましょう。Gitは、ノードとポインタで構成されるツリー構造によってファイルを管理・追跡しています。 ローカルのGitリポジトリには、基本的に次の3つの「ツリー」が存在します。 作業ディレクトリ(Working Directory):ワーキングツリーとも呼ばれ、ローカルディレク
-
GitとGitHubの使い方入門:初心者向けステップバイステップガイド
GitHubは現在、世界最大のオープンソースプロジェクトホスティングサービスです。Atomテキストエディタ、GoogleのTensorFlow、Facebook(現Meta)のReactなど、有名なプロジェクトが多数公開されています。ビッグデータ、人工知能(AI)、IoTといった先進的な分野のプロジェクトで特に知られていますが、アニメーション、絵文字、ゲーム、シンプルなソフトウェアなども見つけることができます。仕組みは「トレント」にやや似ていますが、扱う対象がソフトウェアやアプリである点が異なります。 GitHubを使い始めたばかりの方にとって、学習曲線はかなり急に感じられるかもしれません。