나는 마스터 저장소가 아닌 저장소 만 덮어 쓸 수 있도록 저장소를 보호하고 싶습니다. 선택한 지점 만 보호하는 방법이 있습니까?git에서 선택한 분기로의 fastforward가 아닌 푸시를 방지하려면 어떻게해야합니까?
답변
당신은 비 FastForward의 차단 설정에 브랜치 별 권한 (관리자)를 GitEnterprise을 사용할 수 있습니다 참조하시기 바랍니다 것은 세분화 된 액세스 권한을 사용하여 푸시합니다.
그리고 git config --system receive.denyNonFastForwards true
은 모든 브랜치에 대한 변경 내역을 차단해야하는 경우 간단히 작업을 수행합니다.
This SO answer 당신이 찾고있는 것을 줄 것입니다. 그냥 대신 마스터 브랜치에 적용 할 편집 :
#!/bin/sh
# lock the master branch for pushing
refname="$1"
if [ "$refname" = "refs/heads/master" ]
then
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo "You cannot push to the master branch."
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
exit 1
fi
exit 0
업데이트 :
이 모두 빨리 감기를 포함한 마스터 분기에 밀어 방지 할 수 있습니다.
이렇게하면 선택한 분기로 푸시되지 않습니다. 빨리 감기는 허용되어야합니다. –
[여기, 누군가가 업데이트 스크립트의 강제성을 감지하는 방법을 알아 냈습니다.] (http://stackoverflow.com/a/12258773/444255) 자세한 설명, 마지막 스 니펫은 여전히 수행해야합니다. –
당신은 denyNonFastForwards
git config --system receive.denyNonFastForwards true
을 구성하여 비 빨리 감기 업데이트를 방지 할 수 있습니다하지만 모든 지점에 적용됩니다. 더 많은 정보 ProGit
나는 그것이 당신이 당신의 저장소에 접근하기 위해 서버 측에서 사용하는 것에 달려 있다고 생각한다. Gerrit 또는 Gitlab과 같은 분기 별 권한을 지원하는 서버 응용 프로그램이 있습니다 (단, Gitlab에서 유스 케이스를 지원하는지 확실하지 않습니다). Gerrit는 회사에서 유사한 워크 플로우를 사용하기 때문에이를 지원합니다.
Gitolite도 Gitlab에서 사용하기 때문에 설치가 쉽지만 Gerrit 또는 Gitlab과 같은 웹 인터페이스는 없습니다.
추가 설명 : 제안 된대로 GitEnterprise도 좋은 해결책이지만 내 회사의 서버 (많은 회사에서 공통적 인 서버)를 사용하는 경우 내 제안이 적합합니다.
내 자신을 위해 작성한 업데이트 후크 (후크/업데이트에 복사)가 있습니다. 이 스크립트는 기본적으로 모든 비 순방향 업데이트를 거부하지만 명시 적으로 구성된 분기에 허용합니다. master 브랜치를 제외한 모든 것이 fast-forward가 아닌 업데이트가 허용되도록 반전하기는 쉽습니다.
#!/bin/sh
#
# A hook script to block non-fast-forward updates for branches that haven't
# been explicitly configured to allow it. Based on update.sample.
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
#
# Config
# ------
# hooks.branch.<name>.allownonfastforward
# This boolean sets whether non-fast-forward updates will be allowed for
# branch <name>. By default they won't be.
# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
# --- Safety check
if [ -z "$GIT_DIR" ]; then
echo "Don't run this script from the command line." >&2
echo " (if you want, you could supply GIT_DIR then run" >&2
echo " $0 <ref> <oldrev> <newrev>)" >&2
exit 1
fi
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
echo "Usage: $0 <ref> <oldrev> <newrev>" >&2
exit 1
fi
# --- Check types
# if $newrev is 0000...0000, it's a commit to delete a ref.
zero="0000000000000000000000000000000000000000"
if [ "$newrev" = "$zero" ]; then
newrev_type=delete
else
newrev_type=$(git cat-file -t $newrev)
fi
case "$refname","$newrev_type" in
refs/tags/*,commit)
# un-annotated tag
;;
refs/tags/*,delete)
# delete tag
;;
refs/tags/*,tag)
# annotated tag
;;
refs/heads/*,commit)
# branch
# git rev-list doesn't print anything on fast-forward updates
if test $(git rev-list "$newrev".."$oldrev"); then
branch=${refname##refs/heads/}
nonfastforwardallowed=$(git config --bool hooks.branch."$branch".allownonfastforward)
if [ "$nonfastforwardallowed" != "true" ]; then
echo "hooks/update: Non-fast-forward updates are not allowed for branch $branch"
exit 1
fi
fi
;;
refs/heads/*,delete)
# delete branch
;;
refs/remotes/*,commit)
# tracking branch
;;
refs/remotes/*,delete)
# delete tracking branch
;;
*)
# Anything else (is there anything else?)
echo "hooks/update: Unknown type of update to ref $refname of type $newrev_type" >&2
exit 1
;;
esac
# --- Finished
exit 0
마스터 브랜치를 제외한 모든 것이 고속 순방향 업데이트를 허용하도록 스크립트를 수정할 수 있다면 유용 할 것입니다 – Ren
서버를 수정할 수 있으면 서버에서 빨리 감기를 사용할 수 있습니다.
ssh ip 'echo $"[receive]
denyDeletes = false
denyNonFastForwards = false" >> /path/to/repo/config'
#then git push -f origin master
denyNonFastForwards는 당신이 사용해야하는 '해결책'. 강제로 푸시를 거부하는 git hook을 설정하십시오 ... 이것이 올바른 방법입니다. – Eric
@Eric 비 순식간 푸시를 거부하는 것은 실제로 GitHub/BitBucket으로가는 길입니다. 새로운 자전거는 발명되지 않았습니다. –
모든 지점에서 모든 고속 전달을 거부하는 경우 기능 분기를 병합하는 방법은 무엇입니까? – Eric