2016-10-06 5 views
0

私は裸のレポに2つの枝を持っています、マスターとスペイン語で開発されている "desarrollo"。私は、中央の裸に競合を押し込むのを避けるために、事前受信フックを作成したい。このフックは中央の裸に配置されます。これは私が持っているものです。リモートベアレポに配置された受信前フックとのプッシュ競合を防ぐ方法を教えてください。

#!/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 

最初の部分は、競合ファイルのプッシュを防ぐことにある、第2の部分は、私が唯一desarrolloブランチにプッシュできるよう、マスターするプッシュ防ぐためです。 2番目の部分は完全に機能しますが、最初の部分はプッシュを妨げていませんが、マークアップ付きのファイルをアップロードしようとするとエラーをスローしません。私は、さまざまなソースからの両方の部分をコピーしたと言うので、そこになければならない必要があります

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: 7 '< < < < < < <'今、それはperfec最終的なスクリプトは

#!/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であるはずです。その後、元のコンフリクトチェックは正しいはずで、ブランチ保護を$remote_refの代わりに$refnameに変更すると、すべてが機能するはずです。

pre-pushスクリプトからこの部分をコピーしました。入力は、1行につき<local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LFです。

+0

これはうまくいきましたが、問題は、「desarrolloの競合マーカーを見た」というメッセージに関係なくプッシュを拒否し続けるということです。競合するファイルがないようです..... git diff - -name-only --diff-filter =そのコマンドでUIがチェックされていて、リストが空です.....チェックしていますか?<<<<<を使ってbashスクリプトの競合をチェックする正しい方法をしていますか? <<文字列か、より良い選択肢がありますか?...私のスクリプトはhttps://codeshare.io/266oZ – Juan

+0

になりましたif文字列を '<<<<<'から '<<<<<に変更しました<<<<<を持っていて、衝突していないファイルがあり、gitがちょうど7 <を入れているからです。私の友人に助けてくれてありがとう。問題が解決しました – Juan