복제된 저장소에 있고 원격 지점으로 푸시하려고 합니다. 커밋은 잘 작동하지만 푸시하려고 할 때마다 다음과 같은 결과가 나타납니다.
error: unable to write file ./objects/foo/bar: Permission denied
나는 로컬 저장소에 있는 모든 파일을 소유하고 있으며 일반적으로 푸시가 잘 작동하지만 얼마 후 이 오류가 발생하여 푸시할 수 없습니다.
문제를 해결하는 유일한 방법은 오리진의 마지막 커밋으로 되돌리고 문제를 일으킬 것으로 예상되는 파일을 찾는 것입니다.
그런 다음 새 파일을 터치하고 이전 "깨진" 파일의 내용을 붙여넣습니다. 때때로 이것은 도움이 되지 않으며 분명히 관리 가능한 해결 방법이 아닙니다.
답변1
이 문제가 발생하여 이 질문을 발견했습니다. 에 게시된 팁을 읽었습니다.https://www.thegeekstuff.com/2017/05/git-push-error/문제를 해결한 내용을 요약하겠습니다.
수정 사항은 모든 git 사용자가 추가된 공유 그룹을 포함하도록 GIT REPO를 보유하는 호스트를 구성하는 것이었습니다. 예를 들어 /etc/group
git:x:4001:user1,user2
그런 다음 git repo를 보유하는 호스트에서 다음 명령을 실행합니다.
cd /local/git-repos/repo1.git
sudo chgrp -R git objects
sudo chmod -R g+rws objects
나에게는 이것이 문제를 해결했습니다. 참조된 기사에서는 저장소를 공유 저장소로 구성하는 방법에 대해 자세히 설명하지만 아직 이 작업을 수행하지 않았습니다.
git config core.sharedRepository group
왜 이런 일이 일어날 수 있습니까? 관심이 있으시면 계속 읽어보세요.
왜 이런 일이 발생합니까?
나(user1)가 동료들과 공유하고 있던 개인 git repo를 설정할 때 이런 일이 일어났습니다. 저장소는 내 호스트(host1)에 있었고 user2@host2도 이를 사용하고 있었습니다.
다음은 이를 설정하는 데 사용한 단계이며, 적절한 위치에서 문제가 발생하는 위치를 설명합니다.
저는 user1@host1이고 다음을 사용하여 기본 git 저장소를 만듭니다.
mkdir /local/git-repos cd /local/git-repos git init --bare repo1.git
git repo에 사용되는 이름이 논리적 이름이 되도록 ~/.ssh/config 파일을 설정했습니다. 이렇게 하면 상자를 다른 컴퓨터로 옮긴 경우 호스트 별칭을 새 컴퓨터 이름으로 업데이트하기만 하면 됩니다.
파일:
$HOME/.ssh/config
Host mygithost HostName host1
그런 다음 다음을 사용하여 저장소를 복제합니다.
cd $HOME git clone mygithost:/local/git-repos/repo1.git cd repo1 # Add files and use normal git commands git add -u . git commit git push
업데이트는 컴퓨터의 git repo로 전송됩니다.
user2가 동일한 GIT 저장소에 액세스할 수 있도록 설정
- user1에 대해 수행한 것처럼 $HOME/.ssh/config 파일을 설정해야 합니다.
- 사용자가 호스트 1에 SSH로 접속했는지 확인하세요.
ssh user2@mygithost echo it worked cd $HOME git clone mygithost:/local/git-repos/repo1.git
이 시점에서 사용자 user1과 user2는 모두 공유 GIT 저장소에 액세스할 수 있습니다.
만약에둘 다사용자가 커밋을 하면 git REPO 객체 파일은 가 소유한 일부 파일
user1
과 가 소유한 일부 파일을 갖게 됩니다user2
. 문제는 나중에user1
파일을 GIT HOST에 푸시하려고 할 때object
생성된 파일과 디렉터리를 소유할 수 있으므로user2
다음 오류가 발생한다는 것입니다.error: insufficient permission for adding an object to repository database ./objects fatal: failed to write object error: unpack failed: unpack-objects abnormal exit ! [remote rejected] master -> master (n/a (unpacker error)) error: failed to push some refs to [email protected]:/home/git/myproj
해결책은 모든 사용자가 다른 사용자가 만든 파일을 읽고 쓸 수 있도록 git bare repo를 구성하는 것입니다. 이는 권한을 사용하여 다음 단계에서 수행됩니다
UNIX GROUP
.다른 사용자가 git repo에 액세스할 수 있도록 REPO를 설정합니다.
모든 사용자가 속할 수 있는 GROUP을 만듭니다.
sudo vi /etc/group git:x:4001:user1,user2
새로 생성된 그룹에 올바르게 포함되도록 모든 파일을 변경합니다.
cd /local/git-repos/repo1.git sudo chgrp -R git objects sudo chmod -R g+rws objects
위에서 만든 공유 그룹을 사용하세요(
git
이 예에서는).
참고: group-suid 비트는 나중에 생성되는 파일/디렉터리가 상위 디렉터리와 동일한 설정을 유지하게 하므로 중요합니다. 에서https://www.redhat.com/sysadmin/suid-sgid-sticky-bit, 그것은 말한다 :
디렉터리에 설정된 경우 해당 디렉터리에 생성된 모든 파일의 그룹 소유권은 디렉터리 소유자의 그룹 소유권으로 설정됩니다.
요약
이 오류는 일반적으로 일반적으로 호스팅되는 GIT REPO에서는 발생하지 않습니다. 그러나 개인(파일 기반) 저장소가 설정되어 여러 사용자에 의해 공유되는 상황에서는 이런 일이 발생할 수 있습니다.