이 시점까지 나만 쓸 수있는 기존 git repo (맨손으로 하나)가 있습니다. foo의 모든 구성원이 푸시 할 수 있도록 일부 UNIX 사용자 그룹 인 foo에 공개하고 싶습니다. 다음을 사용하여 새 git repo를 쉽게 설정할 수 있다는 것을 알고 있습니다 .
git init --bare --shared=group repodir
chgrp -R foo repodir
하지만 기존 저장소 디렉토리에 대해 동등한 작업이 필요합니다 .
이 시점까지 나만 쓸 수있는 기존 git repo (맨손으로 하나)가 있습니다. foo의 모든 구성원이 푸시 할 수 있도록 일부 UNIX 사용자 그룹 인 foo에 공개하고 싶습니다. 다음을 사용하여 새 git repo를 쉽게 설정할 수 있다는 것을 알고 있습니다 .
git init --bare --shared=group repodir
chgrp -R foo repodir
하지만 기존 저장소 디렉토리에 대해 동등한 작업이 필요합니다 .
답변:
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")
git init --shared
기존 저장소 에서 명령을 사용 하여 구성 값을 설정할 수 있습니다 . 또한 chmod
파일의 권한을 올바르게 얻으려면 명령 을 수행해야합니다 .
git pull
아닌 루트 로 등을 수행했기 때문에 엉망이 된 경우에도 도움이되며 www-data
결과적으로 error: insufficient permission for adding an object to repository database .git/objects
. find
및 -type d
/ 를 사용하여 잘못된 모든 파일 / 디렉터리의 소유권을 수정했다고 생각 type -f
했지만이 방법 만 오류를 제거했습니다 (일부 하위 디렉터리의 파일이 그룹 쓰기 가능하지 않았기 때문일까요?).
core.sharedRepository
이것을 언급 할 것이라고 생각합니다. 사용자가 모든 파일 그룹을 쓰기 가능하게 만들지 않으면 쓸모없는 것 같습니다.
repo dir에서 다음 명령을 실행하십시오.
git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir
편집 : 잦은 혼동을 해결하기 위해 group
실제 키워드이므로이를 그룹 이름으로 바꾸면 안됩니다.
group
:) 그룹의 이름이 아니다
git config core.sharedRepository dev
다음을 입력 git config
내가 얻을 수 fatal: bad config value for 'core.sharedrepository' in .git/config
있는 git version
1.7.0.4
(그리고 아마도 버전 이후)
git config core.sharedRepository group
group
그룹의 이름이 아니라 실제 값입니다!
@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 ) 의 그룹 이름입니다 .chmod g-w objects/pack/*
(베어 저장소가 아닌 경우 앞에 추가 .git/
)
find . -type d
'는 오류를 발생시킵니다unable to execute /bin/chmod: Argument list too long
chmod g+s `find . -type d`
확장되지 않습니다. 사용find -type d -exec chmod g+s {} +
chmod g-w objects/*/*
. 이 저장소에 대해 비어 있기 때문에 info 하위 디렉토리에 대해 잘 모르겠습니다.
이것은 아마도 필요하지 않지만 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에서 )