У меня есть две ветви на моем голой репо, Мастер и «десарролло», которая является развитием на испанском языке. Я хочу создать крюк pre-receive, чтобы избежать нажатия конфликтов на центральный голый. Этот крюк будет располагаться на центральном голом. Это то, что у меня есть:Как предотвратить конфликты толкания с крюком pre-receive, установленным на удаленном основном репо?
#!/bin/bash
protected_branch='master'
# check each branch being pushed
while read local_ref local_sha remote_ref remote_sha
do
if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<|>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
exit 1
fi
remote_branch=$(echo $remote_ref | sed -e 's,.*/\(.*\),\1,')
if [ $protected_branch = $remote_branch ]
then
echo "ABORT PUSH: Not allowed to push directly to $protected_branch."
exit 1 # push will not execute
fi
done
exit 0
Первая часть, чтобы предотвратить толчок конфликтующих файлов, а вторая часть, чтобы предотвратить толкая к хозяину, я только позволю выталкиваю Desarrollo ветви. Вторая часть работает отлично, но первая часть не мешает нажатию, но она не выдает ошибок либо при попытке загрузить файл с помощью разметки. Я хочу, чтобы сделка потерпеть неудачу в целом, а не только отвергают конфликтные файлы, но и весь толчок в случае, если есть хотя бы один файл в конфликте:
if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<|>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
exit 1
fi
Я должен сказать, что я скопировал оба части из разных источников, поэтому должны что-то не так с именами переменных, я просто хочу знать, что переменные old_sha и new_sha являются причиной того, почему это не удается, поскольку я не очень хорош в создании крючков.
EDIT: Я изменил сравнение строк с 5 по 7 '< < < < < < <' а теперь это работает perfec tly, окончательный сценарий
#!/bin/bash
protected_branch='master'
# check each branch being pushed
while read old_sha new_sha refname
do
if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<<<|>>>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
exit 1
fi
remote_branch=$(echo $refname | sed -e 's,.*/\(.*\),\1,')
if [ $protected_branch = $remote_branch ]
then
echo "ABORT PUSH: Not allowed to push directly to $protected_branch."
exit 1 # push will not execute
fi
done
exit 0
Теперь он работает, но проблема в том, что он продолжает отказываться от нажатия, несмотря ни на что с сообщением «Увидел маркер конфликта в десарролло», и у меня нет файлов в конфликте ..... git diff - -name-only --diff-filter = UI проверяется с помощью этой команды, и список пуст. ..... Я проверяю, что я делаю правильный путь, чтобы проверить конфликты в сценарии bash, используя <<<<< << строка или есть лучшая альтернатива там ... Мой скрипт теперь https://codeshare.io/266oZ – Juan
Я изменил строки if от << <<<<< »на '<<<<< << ', так как у меня были файлы, которые имели <<<<< и не были конфликтующими, и git помещает ровно 7 <. Большое вам спасибо за помощь моему другу. Задача решена – Juan