Git получил предварительный зацеп в выпуске 1.8.2.
Предварительные push-зацепки - это то, что мне нужно, а также зацепки до фиксации. Помимо защиты ветки, они также могут обеспечить дополнительную безопасность в сочетании с хуками предварительной фиксации.
И для примера того, как использовать (взято и принято и улучшено с эта хорошая запись )
Простой пример, чтобы войти в vagrant, запустить тесты и затем нажать
#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push
CMD="ssh vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key 'cd /vagrant/tests; /vagrant/vendor/bin/phpunit'"
protected_branch='master'
# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
exit 0
fi
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [[ $current_branch = $protected_branch ]]; then
eval $CMD
RESULT=$?
if [ $RESULT -ne 0 ]; then
echo "failed $CMD"
exit 1
fi
fi
exit 0
Как видите, в примере используется защищенная ветвь, являющаяся предметом ловушки предварительного нажатия.