Решение, которое вы предложили, безопасно, если вы (1) нажимаете на ветку, отличную от master
, например, merge-request
и (2) проверяете слияние.Для второй части, быстрой перемотки вперед, если на пульте все в порядке, вы можете использовать post-update
ловушку, подобную этой:
#!/bin/sh
# check args to see if merge-request was pushed,
# and do nothing if it wasn't
if ! $(echo $@ | grep -q 'merge-request');
then
echo "merge-request not updated"
exit 0
fi
# cancel if master is not checked out
THIS_BRANCH=$(git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$THIS_BRANCH" != "master" ];
then
echo "master not checked out, not merging"
exit 1
fi
# cancel if working dir is dirty
if [ $(git status --porcelain | wc -l) != 0 ];
then
echo "working dir is dirty, not merging"
exit 1
fi
# try to merge, but only do so if the merge is fast-forward
# try to delete, but only do so if the merge succeeded
git merge --ff-only merge-request && git branch -d merge-request
Убедитесь, что chmod +x
ваш скрипт после обновления,Когда вы нажимаете, вывод этой ловушки будет отображаться в консоли с предисловием «remote:»
Чтобы перейти с master
на origin/merge-request
на пульте, вы можете установить push
var в вашей удаленной конфигурации в .git/config
(который позволяет вам звонить git push origin
:
[remote "origin"]
push = +refs/heads/*:refs/merge-request/*
или вы можете установить псевдоним для репозитория:
[alias]
push = push origin master:merge-request