Git은 프로젝트 폴더 내부의 .git/ 디렉터리에 있는 파일들에 대한 쓰기 권한을 필요로 합니다. Git 명령줄이 이 폴더에 접근할 수 없으면, 파일을 pull하려는 시점에 "cannot open .git/FETCH_HEAD: Permission denied"와 같은 오류가 발생합니다.
이 글에서는 이 오류가 무엇을 의미하는지, 어떤 원인으로 발생하는지 살펴보고, 실제 예시를 통해 문제를 해결하는 방법까지 단계별로 알아보겠습니다.
'cannot open .git/FETCH_HEAD: Permission denied' 오류란?
Git 저장소에는 .git/라는 특별한 폴더가 포함되어 있습니다. 이 폴더는 숨김 처리되어 있기 때문에 평소에는 눈에 띄지 않았을 수 있습니다. 폴더 이름 맨 앞에 마침표(".")가 붙어 있다는 것이 숨김 폴더임을 나타내는 표시입니다.
이 폴더에는 저장소에 관한 다양한 메타데이터가 저장되어 있습니다. 프로젝트별 설정 옵션, 참조(reference) 정보, 현재 HEAD 위치 등 저장소 운영에 필수적인 정보들이 모두 여기에 기록됩니다.
Git은 이 폴더에 대한 읽기 및 쓰기 권한을 필요로 합니다. git config, git pull 같은 명령을 실행할 때마다 폴더의 내용이 변경되기 때문입니다.
오류 발생 예시
GitHub에서 ck-git이라는 저장소를 클론(clone)해 보겠습니다. 이 저장소에는 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 튜토리얼용 데모 파일이 담긴 저장소입니다.
훨씬 나아졌습니다. 이제 파일이 Git 저장소의 목적을 더 정확하게 설명하고 있습니다. 커밋을 생성하기 위해 이 변경 사항을 스테이징 영역에 추가해 보겠습니다.
sudo git add README.md
Git은 다음 커밋에 README.md를 포함하려는 의도를 인식합니다. 변경 사항을 원격 저장소에 반영하려면 커밋으로 만들어야 합니다.
sudo git commit -m "docs: Make README.md more descriptive"
이제 커밋을 원격 저장소에 푸시할 준비가 되었습니다. 푸시하기 전에 먼저 원격 저장소를 pull해서, 클론 이후 다른 변경 사항이 있었는지 최신 상태를 확인하겠습니다.
git pull
그런데 이 명령은 다음과 같은 오류를 반환합니다.
error: cannot open .git/FETCH_HEAD: Permission denied
이 오류는 Git이 자체 구성 파일 중 하나인 FETCH_HEAD에 접근하지 못한다는 의미입니다.
해결 방법
앞서 우리는 ck-git 저장소를 sudo 명령으로 클론했습니다. 즉, 저장소가 root(루트) 사용자 권한으로 클론된 것입니다. 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 없이 일반 사용자 권한으로 원격 저장소를 pull하려고 하면 오류가 발생합니다. 현재 사용자 계정에는 해당 폴더의 파일을 수정할 권한이 없기 때문입니다.
이 문제를 해결하려면 폴더 내 파일들의 소유권을 변경해야 합니다. 이때 chown 명령을 사용합니다.
sudo chown -R james:staff .
이 명령은 .git/ 폴더를 포함해 저장소 내 모든 파일과 폴더의 소유권 정보를 일괄 변경합니다. 이제 현재 사용자가 디렉터리의 소유자가 되어 프로젝트 폴더에 완전히 접근할 수 있습니다. 다시 코드를 pull해 보겠습니다.
git pull
이번에는 명령이 성공적으로 실행되며 다음과 같은 결과를 반환합니다.
Already up to date.
이는 마지막으로 코드를 pull한 시점(저장소를 처음 만들었을 때) 이후 원격 저장소에 변경된 사항이 없다는 뜻입니다. 문제가 성공적으로 해결된 것입니다.
마무리
Git의 "cannot open .git/FETCH_HEAD: Permission denied" 오류는 프로젝트 폴더의 .git/ 디렉터리에 현재 사용자가 접근할 수 없는 상태에서 원격 저장소의 코드를 pull하려고 할 때 발생합니다.
이 오류를 해결하려면 작업 중인 Git 저장소와 하위 폴더에 대해 현재 사용자가 읽기·쓰기 권한을 갖고 있는지 반드시 확인하세요. 특히 sudo git clone처럼 관리자 권한으로 저장소를 생성했다면, chown 명령으로 소유권을 일반 사용자에게 넘겨주는 것이 가장 확실한 해결책입니다.