Git 푸시가 객체 파일에 쓸 수 없습니다. 권한이 거부되었습니다.

Git 푸시가 객체 파일에 쓸 수 없습니다. 권한이 거부되었습니다.

복제된 저장소에 있고 원격 지점으로 푸시하려고 합니다. 커밋은 잘 작동하지만 푸시하려고 할 때마다 다음과 같은 결과가 나타납니다.

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도 이를 사용하고 있었습니다.

다음은 이를 설정하는 데 사용한 단계이며, 적절한 위치에서 문제가 발생하는 위치를 설명합니다.

  1. 저는 user1@host1이고 다음을 사용하여 기본 git 저장소를 만듭니다.

    mkdir /local/git-repos
    cd /local/git-repos
    git init --bare repo1.git
    
  2. git repo에 사용되는 이름이 논리적 이름이 되도록 ~/.ssh/config 파일을 설정했습니다. 이렇게 하면 상자를 다른 컴퓨터로 옮긴 경우 호스트 별칭을 새 컴퓨터 이름으로 업데이트하기만 하면 됩니다.

    파일:$HOME/.ssh/config

    Host mygithost
        HostName host1
    
  3. 그런 다음 다음을 사용하여 저장소를 복제합니다.

    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로 전송됩니다.

  4. 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.

  5. 다른 사용자가 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에서는 발생하지 않습니다. 그러나 개인(파일 기반) 저장소가 설정되어 여러 사용자에 의해 공유되는 상황에서는 이런 일이 발생할 수 있습니다.

관련 정보