UNIX 그룹에서 공유 할 기존 git 저장소를 구성하는 방법


98

이 시점까지 나만 쓸 수있는 기존 git repo (맨손으로 하나)가 있습니다. foo의 모든 구성원이 푸시 할 수 있도록 일부 UNIX 사용자 그룹 인 foo에 공개하고 싶습니다. 다음을 사용하여 git repo를 쉽게 설정할 수 있다는 것을 알고 있습니다 .

git init --bare --shared=group repodir
chgrp -R foo repodir

하지만 기존 저장소 디렉토리에 대해 동등한 작업이 필요합니다 .


4
거기에 이 질문에 좋은 답변 에 Serverfault (다른 StackOverflow의 사이트)에 이상이.
Zearin

답변:


114

repodir그룹의 사용자를 위해 작업중 인 기존 저장소를 만들려면 다음을 시도하십시오 foo.

chgrp -R foo repodir                 # set the group
chmod -R g+rw repodir                # allow the group to read/write
chmod g+s `find repodir -type d`     # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")

14
리포지토리의 구성에서 config.sharedRepository = true를 설정해야 할 수도 있습니다. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos 2010-07-13

1
이것은 내가 혼자하는 일과 매우 비슷하지만 외부 확인을 받고 싶었습니다. 감사. :) 나는 또한 git clone --shared = group 일종의 일이 있기를 바랐지만 clone의 --shared 옵션은 완전히 다른 일을합니다.
Pistos 2010-07-13

5
git init --shared기존 저장소 에서 명령을 사용 하여 구성 값을 설정할 수 있습니다 . 또한 chmod파일의 권한을 올바르게 얻으려면 명령 을 수행해야합니다 .
Spencer

1
이를 확인하는 것은 누군가가 소유자가 git pull아닌 루트 로 등을 수행했기 때문에 엉망이 된 경우에도 도움이되며 www-data결과적으로 error: insufficient permission for adding an object to repository database .git/objects. find-type d/ 를 사용하여 잘못된 모든 파일 / 디렉터리의 소유권을 수정했다고 생각 type -f했지만이 방법 만 오류를 제거했습니다 (일부 하위 디렉터리의 파일이 그룹 쓰기 가능하지 않았기 때문일까요?).
William Turrell

1
사용자의 umask는 여전히 새로 생성 된 파일에 적용되는 것 같습니다. 그것이 당신이 기대하는 것입니까? 의 문서에서 core.sharedRepository이것을 언급 할 것이라고 생각합니다. 사용자가 모든 파일 그룹을 쓰기 가능하게 만들지 않으면 쓸모없는 것 같습니다.
Sam Brightman

47

repo dir에서 다음 명령을 실행하십시오.

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

편집 : 잦은 혼동을 해결하기 위해 group실제 키워드이므로이를 그룹 이름으로 바꾸면 안됩니다.


25
어디는 group:) 그룹의 이름이 아니다
피에르 드 LESPINAY

7
개체 및 팩 파일은 변경 불가능해야합니다. 444 / r--r--r-- 권한이 있어야합니다.
CB Bailey

3
시도 후 git config core.sharedRepository dev다음을 입력 git config내가 얻을 수 fatal: bad config value for 'core.sharedrepository' in .git/config있는 git version 1.7.0.4(그리고 아마도 버전 이후)
Kzqai

3
git config core.sharedRepository group group그룹의 이름이 아니라 실제 값입니다!
kixorz

"group"대신 그룹 이름을 사용하는 실수를했다면 텍스트 편집기에서 .git / config를 열고 core.sharedRepository 줄을 "group"이라고 말하도록 편집하십시오.
Tom

43

@David Underhill@kixorz 답변을 병합 하여 나만의 (최종) 솔루션을 만들었습니다.

그것은을위한 베어 의 repos와 비 베어 의 repos. 그들 사이에는 약간의 차이가 있지만 이런 방식으로 더 명확합니다.

베어 저장소

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w objects/pack/*                  # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

어디:

  • <repo.git>일반적으로 서버에있는 베어 저장소 디렉토리입니다 (예 :) my_project.git/.
  • <group-name>git 사용자 (예 : users ) 의 그룹 이름입니다 .

비 베어 리포지토리

cd <project_dir>/                         # Enter inside the project directory
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w .git/objects/pack/*             # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

어디:

  • <project_dir>.git폴더가 포함 된 프로젝트 디렉토리 입니다.
  • <group-name>git 사용자 (예 : users ) 의 그룹 이름입니다 .

Charles가 말했듯이 또한 다음을 수행합니다. chmod g-w objects/pack/*(베어 저장소가 아닌 경우 앞에 추가 .git/)
Wernight

여기에서 그룹 이름을 찾거나 그룹 이름을 만드는 방법은 무엇입니까?
Sujithrao

'chmod g + s find . -type d'는 오류를 발생시킵니다unable to execute /bin/chmod: Argument list too long
Dr.X

@ Dr.X가 언급했듯이 chmod g+s `find . -type d`확장되지 않습니다. 사용find -type d -exec chmod g+s {} +
hagello

모든 느슨한 객체는 사전 공유 상태에 따라 읽기 전용이어야한다고 생각합니다. 아마도 chmod g-w objects/*/*. 이 저장소에 대해 비어 있기 때문에 info 하위 디렉토리에 대해 잘 모르겠습니다.
Eric

3

이것은 아마도 필요하지 않지만 denyNonFastForwards 옵션 git init --bare --shared도 설정 한다는 점을 지적 할 가치가 있습니다.

git config receive.denyNonFastForwards true

이 옵션의 의미는 다음과 같습니다.

receive.denyNonFastForwards

이미 푸시 한 커밋을 리베이스 한 다음 다시 푸시를 시도하거나, 그렇지 않으면 원격 브랜치가 현재 가리키는 커밋을 포함하지 않는 원격 브랜치에 커밋을 푸시하려고하면 거부됩니다. 이것은 일반적으로 좋은 정책입니다. 그러나 rebase의 경우 수행중인 작업을 알고 있고 push 명령에 -f 플래그를 사용하여 원격 분기를 강제 업데이트 할 수 있음을 확인할 수 있습니다.

( http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration에서 )


1

그룹이 읽기 / 쓰기를 허용하는 위의 답변 외에도 사용자를 그룹에 추가해야합니다 (예 : "foo").

sudo usermod -a -G [groupname] [username]

참고 : 존재하지 않는 경우 먼저 사용자를 만들어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.