2011-03-15 3 views
12

내 사무실 용으로 관리하는 GIT 저장소가 있습니다. 회사 정책으로 인해 GitHub와 같은 외부 호스팅 제공 업체는 사용할 수 없습니다. 그래서, 나는 우리의 로컬 네트워크로 할 수있는 일을하기 위해 남았습니다.GIT 원격 저장소 공유에 대한 파일 사용 권한 문제

누구나 자신의 로컬 리포지토리를 관리하지만, 우리는 또한 사용자가 푸시 할 때 (예 : 허드슨과 어안과 같은 애플리케이션에서 액세스 할 수있는) 원격 리포지토리를 중앙 리포가 전복에서 작동하는 것과 비슷하게 만듭니다. 각 사용자는 원격 저장소를 호스팅하는 상자에 대해 암호없는 인증을 수행 할 수 있도록 공개 키를 설정합니다.

우리의 원격 저장소에

, 나는 그들이 구성된이 "그룹"모드에서 공유 할 수 있습니다 망할 놈 그룹의 구성원은 또한

git config core.sharedRepository group 

모든 사용자,하지만 많은 기본 그룹 아니다 사용자의 git이 "푸시 (push)"에있는 객체를 생성하거나 업데이트 할 때 사용자의 기본 그룹을 사용하는 것으로 보입니다. 대신, 나는 각 사용자가 구성원 인 공통 "자식"그룹을 사용해야한다. 이전에 웹에서 끈적 끈적한 비트 설정에 대해 논의한 문서를 보았습니다.하지만 소스에 따라 달라진 것 같았으며 공통 그룹을 만드는 문제를 실제로 해결하지 못했습니다 (파일을 임의로 쓰기 가능하게 만드는 경우, 나는 그들을 777로 만들 수도있다).


업데이트 : 사용

매튜 Flaschen의 answer below

chgrp -R git repo.git 
find repo.git -type d -exec chmod g+rws {} + 

나는 모든 사람들이 밀어 함께에서 풀 수있는 저장소를 만들 수 있었다. 나는 또한 gitolite를 조사 할 것이지만 나의 요구는 아주 기본적이며 우리 환경은 사용자와 키를 자동으로 구성 할 수 있으므로 사용은 중요하지 않습니다. 그러나, 나는이 문제를 다루고 있는지 확인하고 싶습니다.

내 저장소 구조에는 최상위 디렉토리 (remote-repos)와 각 저장소 (app-1.git, app-2.git, library-1.git 등)에 대한 하위 디렉토리가 있습니다. 각 개별 repo 대신 최상위 디렉토리 (remote-repos)에 chmod g + rws {} +를 적용 할 수 있어야합니다. 맞습니까? 찾기 명령

find /opt/remote-repos -type d -exec ... 

/opt/remote-repos 위치에있는 모든 디렉토리를 찾아 명령을 실행합니다. 명령 (chmod g + rws)은 그룹이 이러한 파일을 읽고 쓸 수 있도록하며, 고정 된 내기를 설정하여 실행시 지정된 그룹이 항상 사용되도록합니다. (나는 {} + 부분의 사용에 관해서는 단서가 없다. 나는 find exec 옵션과 관련 있다고 가정하고있다).

어쨌든이 솔루션에 대한 내 이해가 올바른지 확인하고 싶습니다.

더 많은 참조 : 위키 피 디아에서

+0

HTTP 기반 솔루션을 설정하고 서버 프로세스 만 중앙 저장소 파일에 쓰기 쉽습니다. – Thilo

+3

[gitolite] (https://github.com/sitaramc/gitolite)를 시도해야합니다! – Simon

+0

gitolite가 좋아 보이는 동안, 나는 이미 enviro에 구운 많은 기능 (ssh 액세스, 키 등)이 있습니다. 정말로 빠진 유일한 부분은 적절한 그룹 권한이었습니다. –

답변

15

자식은 지금 정확히위한 core.sharedRepository 옵션이 있습니다 이 pur 자세.

내가 추천 :

다음
git config core.sharedRepository group 

는, 최초의 그룹 소유권을 설정, 수행

sudo chgrp -R somegroup . 
sudo find -type d -exec chmod g+s {} + 
sudo chmod -R g+rw .git/objects/ 

을 REPO의 루트에.

새로운 REPO를 들어, 당신은 할 수 있습니다 :

git init --shared=group 

을 위의 문제가 해결되지 않는 경우에만 :

chgrp git -R repo.git 
find repo.git -type d -exec chmod g+rws {} + 

S는 setgid를 플래그입니다. 디렉토리의 경우 이는 해당 디렉토리에서 생성 된 파일과 디렉토리가 동일한 그룹 (이 경우에는 git)을 가짐을 의미합니다. 새로 생성 된 서브 디렉토리는 setgid를 상속받습니다.

이것은 내 작업에서 git repo가 ​​설정되는 것과 유사합니다. 그러나, 나는 당신이 실제 자식 서버 프로세스를 고려해야합니다 동의합니다.

+0

잔뜩 놀고 싸우다가 chmod g + rws 비트를 사용하여이 작업을 수행 할 수있었습니다. 원래 질문에 포함시킬 추가 작업이 있습니다 –

+0

@J Jones, 네, 최상위 디렉토리에서 수행 할 수 있습니다. 모두 맨땅 저장소라고 가정합니다. –

+1

-1 권장 설정 [다른 사용자로부터의 푸시만큼 충분하지 않습니다] (http://stackoverflow.com/questions/14196799)/sharedrepository-wrong-group). chmod g + s는 여전히 필요합니다. – Basilevs

0

가장 쉬운 방법은 Gitolite를 사용하는 것입니다. 나는 큰 성공을 거두었 다.

5

사용자는 sudo 권한으로 git 명령을 사용하지 않아야합니다. 예상대로 권한을 재설정 할 수 있습니다 다음 명령을 사용하여

sudo 권한이없는 작동하지 않는 경우, 644755 및 파일 모든 폴더의 권한을 확인해야합니다,

. 위의 명령

find /path/to/repo_folder -type d -exec chmod 755 {} \; 
find /path/to/repo_folder -type f -exec chmod 644 {} \; 

sudo 권한을 사용해야 할 수도 있습니다.

이 활동 후에는 commit + push repo의 모든 변경 사항 repo의 모든 코드 파일에 대한 권한을 다시 작성합니다.