2011-03-10 2 views
13

우리는 원격 위치에서 호스팅되고 git repo를 사용합니다. 해당 repo 사용자가 & 그룹 읽기 가능 & 쓰기 가능하지만 다른 사용자에게는 권한이 없기를 바랍니다. 원격 저장소는 다른 사용자가 소유하고 있습니다 (예 : rUser). 내 로컬 저장소와 원격 저장소에 core.sharedRepository ~ 0660을 설정했습니다. 또한, 내 umask는 0027입니다. 따라서 새 파일을 만들 때마다 다른 파일에 대한 권한이 없습니다.git push는 권한을 허용합니까?

에도 불구하고 원격 리포지토리에 변경 사항을 적용 할 때마다 -r--r--r-- 권한으로 repo.git/objects/ 디렉토리에 새로운 개체가 만들어집니다. 내가 더 이상한 것은 그것이 (원격 사용자 대신에) 디렉토리/파일의 소유자가되게한다는 것이다. 무슨 일있어?

나는 stackoverflow에 관한 몇 가지 겉보기 관련 질문을 통해 답변을 찾는했지만 아무것도 찾을 수 없습니다.

+0

어떻게 원격 저장소에 액세스하고 있습니까? SSH 기반의 방법 ('host : path' 또는'ssh : // host/path' 저장소 URL)을 사용하는 것 같습니다. 네트워크 파일 시스템을 대신 사용한다면 복잡 할 수도 있습니다. –

+0

ssh를 사용하여 액세스하고 있는데 원격 파일 시스템은 실제로 NFS 파일 시스템입니다 (왜 파일 시스템이 여기에 영향을 주는지 확실하지 않습니다). – user10

답변

13

참고 : 각 사용자가 서버에 자신의 사용자로 로그인 할 때 (즉, 저장소에 액세스하기 위해 단일 계정에 여러 사용자가 로그인하지 않은 경우) SSH 기반 액세스 메커니즘을 사용한다고 가정합니다. 이 가정이 사실이 아닐 경우, 다음 답은 완전히 유용하지 않을 수도 있습니다.


개인 저장소의 core.sharedrepository 설정하고 당신이 그것을 액세스하는 데 사용하는 umask를 원격 저장소에 사용되는 소유권 및 권한과 관련이없는.

원격 저장소의 core.sharedrepository에서 0660으로 설정하면 원하는 것을 얻을 수있는 올바른 방법입니다. 리모트 쪽에서 접근하는 사용자의 umask도 의 값인 0xxx을 볼 때 Git이 마스크를 덮어 쓰기 때문에 관련이 없습니다. 모든 파일과 디렉토리가 공통 그룹에 의해 소유되고 모든 디렉토리에 대해 2770 (또는 BSD-ish 시스템의 경우에만 770), objects/??/objects/pack/ 아래의 파일에 대해서는 440, 권한이 올바른지 확인해야합니다. 다른 파일의 경우 660).

새 파일을 만든 사용자가 새 파일을 소유하는 것은 정상적인 현상입니다. 비 BSD 시스템에서는 디렉토리에 setgid 비트 (2000 비트)가 있어야 새 항목이 상위 디렉토리의 그룹 소유자를 상속받습니다. 사용자 소유자는 거의 계승되지 않습니다 (FreeBSD는 setuid 비트를 사용하여 구성 할 수 있지만 정상 구성에서는 사용되지 않습니다). 따라서 모든 파일과 디렉토리는 동일하고 공통된 그룹 소유자를 가져야하지만 저장소 (예 : push)에 대한 각 쓰기는 쓰기 사용자가 사용자 소유 인 일부 파일 및/또는 디렉토리를 남겨 둡니다. 어느 한 사용자 (귀하의 rUser?)가 모든 파일과 디렉토리의 사용자 소유주 일 필요는 없으며, 저장소에 액세스해야하는 모든 사용자는 공통 그룹의 구성원이어야합니다.

1 각 사용자가 분명히/자신이 만든 디렉토리를 모든 파일을 사용자가-소유하지만, 힘내 "원자 재 작성"을 사용하기 때문에 그들은 또한 사용자가 자신의 대부분의 파일들은 수정 것이다 (이것은에 새로운 내용을 기록 동일한 디렉토리에있는 새 파일을 분리 한 다음 원래 파일의 이름을 바꿉니다.

힘들게 새 파일에 대한 umask를 재정의하는 방법에 버그가있을 수 있습니다. 정확히 어떤 파일이 너무 넓은 권한을 얻고 있습니까? Git의 어떤 버전을 원격지에서 저장소에 액세스 할 수 있습니까? 원격지에서 어떤 OS를 실행하고 있습니까?

내 Unixy 컴퓨터에서 두 명의 사용자와 공통 그룹으로 Git 1.7.4.1에서이 문제를 재현 할 수 없습니다.

시나리오를 약간 단순화 해보십시오. 서버 자체에서 직접 원격 저장소로 푸시 (즉, 로컬 복제본을 만들고 버려진 분기로 푸시)하십시오. 로컬 전용 액세스를 사용하면 중간에 어떤 종류의 전송이있을 때보 다 가정 (umask, uids, gids, 사용자 및 그룹 소유권, 파일 및 디렉토리 사용 권한)을 쉽게 확인할 수 있습니다 (Git 자체의 SSH 기반 전송 또는 완전한 충실도로 ID와 권한을 매핑하지 않는 네트워크 파일 시스템).

+0

답변 해 주셔서 감사합니다. 그러나, 나를 위해 아주 간단한 것이 효과가있었습니다. 내 개인 복사본을 삭제하고 새로운 복사본을 체크 아웃했습니다. 이제는 모든 권한을 존중해야합니다. 나는 버전 1.7.2.2의 git을 사용하고있다. – user10

+1

--shared에 관한 한 참고 사항 : umask처럼 사용하지 않습니다. 여기서 umask는 사용 권한을 빼는 대신 설정하는 사용 권한을 지정합니다. --shared = 0077은 소유자가 액세스 할 수 없지만 그룹과 세계가 액세스 할 수 있음을 의미합니다. (이 옵션은 거부됩니다) 반면, --shared = 0700은 소유자 만 액세스 할 수 있음을 의미합니다. –

-2

Gitolite은 git 리포지토리에서 제어 액세스를 관리하는 데 정말로 효과적인 도구 인 것이 좋습니다.

관련 문제