2016-10-06 1 views
0

У меня есть две ветви на моем голой репо, Мастер и «десарролло», которая является развитием на испанском языке. Я хочу создать крюк 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 

ответ

1

Ваше время кажется неправильным. Как вы можете видеть на git help hooks в разделе о pre-receive, вход <old-value> SP <new-value> SP <ref-name> LF в строке, поэтому ваш while должен быть while read old_sha new_sha refname. Тогда ваша первоначальная проверка конфликта должна быть правильной, и вы адаптируете защиту филиала для использования $refname вместо $remote_ref, тогда все должно работать.

Возможно, вы скопировали эту часть из сценария pre-push, где вход <local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF в строке.

+0

Теперь он работает, но проблема в том, что он продолжает отказываться от нажатия, несмотря ни на что с сообщением «Увидел маркер конфликта в десарролло», и у меня нет файлов в конфликте ..... git diff - -name-only --diff-filter = UI проверяется с помощью этой команды, и список пуст. ..... Я проверяю, что я делаю правильный путь, чтобы проверить конфликты в сценарии bash, используя <<<<< << строка или есть лучшая альтернатива там ... Мой скрипт теперь https://codeshare.io/266oZ – Juan

+0

Я изменил строки if от << <<<<< »на '<<<<< << ', так как у меня были файлы, которые имели <<<<< и не были конфликтующими, и git помещает ровно 7 <. Большое вам спасибо за помощь моему другу. Задача решена – Juan

Смежные вопросы