rebase, squash 등으로 이미 remote 에 반영된 커밋을 변경하는 것을 방지하기.
각각 리포지토리의 branch 별로 설정하는게 있긴하지만, 전역 반영기능은 현재 없다.
따라서 gitlab hook을 사용해야 한다.
-
gitlab-shell/hooks/pre-receive.d/disable-force-push.sh
#!/bin/sh
# <oldrev> <newrev> <refname>
# update a blame tree
while read oldrev newrev ref ; do
# old revision is blank - branch creation
if [ "$oldrev" = "0000000000000000000000000000000000000000" ] ||
# new revision is blank - branch deletion
[ "$newrev" = "0000000000000000000000000000000000000000" ] ;
then
# create new or delete old branch
continue;
fi
base=$(git merge-base $oldrev $newrev);
if [ "$base" != "$oldrev" ] ; then
# non fast forward merge
echo "Force pushing of $ref is forbidden";
exit 1;
fi
done
exit 0;