답변:
권한은 해충입니다.
기본적으로 모든 개발자가 git repo의 모든 것에 쓸 수 있는지 확인해야합니다.
개발자 그룹에게 쓰기 기능을 부여하는 탁월한 방법은 New-Wave 솔루션으로 건너 뛰십시오.
모든 개발자를 특별히 만든 그룹에 배치하면 원칙적으로 다음을 수행 할 수 있습니다.
chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo
그런 다음 umask
사용자를로 변경하여 002
그룹 쓰기 가능 권한으로 새 파일을 작성하십시오.
이것의 문제는 군단입니다. 당신이 가정 배포판에라면 umask
의 022
(예 : 공통 것으로 users
기본적으로 모든 사람을 포함 그룹)이 다른 곳에서 보안 문제를 열 수 있습니다. 그리고 조만간, 신중하게 조작 된 권한 체계가 망쳐 져서 root
접근 할 수 있고 수정 될 때까지 (즉, 위의 명령을 다시 실행할 때까지) 리포지토리가 작동 하지 않게됩니다.
잘 이해되지는 않지만 좀 더 많은 OS / 도구 지원이 필요한 우수한 솔루션은 POSIX 확장 속성을 사용하는 것입니다. 나는 최근에이 지역에만 왔기 때문에 여기에 대한 지식은 그다지 뜨겁지 않습니다. 그러나 기본적으로 확장 ACL은 3 개의 기본 슬롯 (사용자 / 그룹 / 기타) 이상에 대한 권한을 설정하는 기능입니다.
다시 한 번, 그룹을 생성 한 후 다음을 실행하십시오.
setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX
이것은 그룹 구성원이 이미 존재하는 파일 (첫 번째 행)을 읽고 쓸 수 있도록 그룹에 대한 확장 ACL을 설정합니다. 그런 다음 모든 기존 디렉토리에 새 파일에 동일한 ACL을 적용해야한다고 지시하십시오 (두 번째 줄).
희망이 당신을 당신의 길에 데려다 줄 것입니다.
chmod -R g+swX
, 그것은 Git을 매우 불행하게 만들었고 더 이상 자식 저장소가 아니라고 결정했다 ( "repo는 자식 저장소가 아닌 것으로 보인다"). 나는 모든 파일 을 chmod gs해야했다 . 디렉토리 에서 setgid 비트를 설정하려면 시도하십시오 find /path/to/repo -type d -print0 | xargs -0 chmod g+s
. 여전히 chgrp -R thegroup /path/to/repo
.
chmod -R g+swX gitrepo
setguid 비트를 파일에 적용하면 보안 상 위험합니다. 대신 find . -type d -exec chmod g+s {} +
디렉토리에만 적용 할 수 있습니다 .
저장소를 만들거나 기존 저장소를 복제하여 새 저장소를 복제 한 경우
$ git init --shared=group
또는
$ git init --shared=0NNN
Git은 기본 umask가 제공하는 것 이상의 권한을 처리해야합니다. 마침내 이것은 내 버전의 Git (1.6.3)에서 사실입니다. 물론 이것은 사용자가 같은 그룹에 있다고 가정합니다.
그러나 다양한 수준의 읽기 / 쓰기로 여러 그룹의 사용자를 관리해야한다면 gitosis로 갈 것입니다. 또한 지사 수준의 권한을 제공하기 위해 가정되는 gitosis 포크 인 gitolite ( http://github.com/sitaramc/gitolite )에 대한 언급을 들었습니다 . 개인적으로 사용했다고 말할 수는 없습니다.
--shared
인수가 16 진수가 아닌 8 진수를 사용 한다는 것 입니다. 나는 이것을 Git 1.7.8의 출처에서 확인했으며 두 번째 예는 git init --shared=0NNN
.
NNN
-permissions 마스크 또는 그룹 번호 또는 뭔가 다른?
git init --bare --shared=group myproj
리포지토리의 경우 myproj는 리포지토리 이름이고, chgrp -R mygroup myproj
mygroup은 그룹 이름입니다.
이것은 언급되지 않았으므로 빨리 추가하고 싶습니다.
권한 문제로 인해 머리가 잘리지 않게하려면 git 공유 리포지토리의 구성 파일에서 다음을 설정하십시오.
[core]
sharedRepository = true
이렇게하면 시스템의 "umask"설정이 존중됩니다.
git config core.sharedRepository true
.
git init --shared
is에 해당 git clone --config core.sharedRepository=true
합니다. --shared
비슷한 명령에서 다른 의미 로 사용할 git의 이상한 .
힘내 사용 설명서 하는 방법에 대해 설명 저장소를 공유하는 여러 가지 방법.
저장소를 공유하는 기능을 갖춘 완전한 방법은 다음과 같습니다.
우리는 6 명의 개발자로 구성된 팀을 위해 GitHub를 사용합니다.
공유 저장소에서 권한을 수정하여 푸시 할 때 권한 문제가 발생하지 않는 한 가지 방법은 업데이트 후 후크 스크립트를 작성하는 것입니다. 이것은 모든 자식 버전에서 작동합니다.
/myrepo.git에 공유 저장소가 있다고 가정하십시오. 해당 저장소의 모든 파일은 mysharedgroup에 속합니다 . 해당 저장소로 푸시하는 모든 사용자는 mysharedgroup 에도 속해야합니다 . 이제 다음 파일을 작성하십시오 ( mysharedgroup 을 환경 설정으로 변경 ).
/myrepo.git/hooks/post-update
#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
/dev/null
. 사용자에게이 메시지를 먼저보고 스스로 결정하도록하십시오.
새로운 리포지토리 설정에 대한 다양한 다른 답변과 의견에서 좋은 조언과 비트를 집계하려면 다음을 수행하십시오.
그룹 myrepo
에 /srv/git
대해 새로운 리포지토리 를 설정하는 경우 mygroup
원하는 것입니다.
mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
mygroup
core.bare = true
: 맨손으로 레포로 만들기core.sharedrepository = 1
(동일하게 core.sharedrepository = group
되찾기 디렉토리와 나중에에서 생성 된 모든 디렉토리가 허용하는 자식에 의해 관리됩니다) mygroup
, 읽기, 쓰기뿐만 아니라 설정 SGID 비트를 (실행 권한을 - 누구가 사용자와 함께 작동하도록, mygroup
하지 그들의 기본 그룹)receive.denyNonFastforwards = 1
: repo에 대한 비 빨리 감기 푸시 거부당신이 미세 조정하려면 사용자, 그룹 또는 다른 사용자의 권한, 사용 --shared=0NNN
, NNN
표준 사용자, 그룹 및 다른 비트있는 파일을 합니다 (실행과에 SGID 비트 디렉토리가 자식에 의해 적절하게 관리됩니다). 예를 들어, 사용자에 대한 읽기 및 쓰기 액세스 권한과 그룹에 대한 읽기 전용 액세스 권한이 있으며 다른 사용자에게는 액세스 권한이 없습니다.
git init --bare --shared=0640 /srv/git/myrepo.git
이를 통해 사용자 및 그룹에 대한 읽기 및 쓰기 액세스가 가능하며 다른 사용자에게는 액세스 할 수 없습니다.
git init --bare --shared=0660 /srv/git/myrepo.git
이를 통해 사용자 및 그룹에 대한 읽기 및 쓰기 액세스 권한과 다른 사용자에 대한 읽기 전용 액세스 권한이 부여됩니다.
git init --bare --shared=0664 /srv/git/myrepo.git
그룹에 대한 쓰기 액세스를 허용하지 않으려면 먼저 chown
repo의 소유자를 설정 한 다음 git init
해당 사용자로 명령 을 실행 하십시오 (리포가 올바른 소유자로 초기화되었는지 확인하십시오). 모든 초기 파일 및 하위 디렉토리).
git-daemon을 사용하여 저장소를 공유 할 수 있습니다. 자세한 정보 는 git-daemon 문서를 읽으십시오 .
편집하다:
이 기사에서 git 저장소를 공유하는 8 가지 방법을 확인하십시오 .