2017-10-26 9 views
0

GITのプリプレスフックを使用してチェックポイントを作成しようとしていますが、ローカルブランチとリモートブランチ名が同じかどうかを確認しています。プッシュ前にローカルおよびリモートブランチを検証する必要があります

ローカルとリモートのブランチが同じ場合にのみプッシュを許可します。私は、プッシュプッシュサンプルフックファイルでこのようなものを試していたが、動作していない。提案してください。

while read local_ref local_sha remote_ref remote_sha 
do 
if [ "$local_ref" != "$remote_ref" ] 
then 
     echo " Please check Remote and local branch names"; 
     exit 1 

else 
     exit 0 
fi 
done 

UPDATE:私の地元の支店は「Gitのpushコマンド」でMybranchで、リモートブランチは、だから私のブランチ名が同じであってもそのは私にエラーを/ Mybranchためレフリー/

与えています、/refs/forを除くリモートからブランチ名だけを抽出するにはどうすればよいですか?

Gitのpushコマンド:あなたのフックは、タグのために実行されるため、一般的には

git push origin Mybranch:refs/for/Mybranch 
+0

「else exit 0」を削除します。フックの名前が正確に 'プッシュプッシュ'であり、実行可能であることを確認してください。私のブランチ名が同じ場合 したがってヘリット/レビュー枝に私の変更をプッシュしていますので、= = Mybranch ローカルおよびリモートレフリーが//Mybranch のためにどのように私は、引用文献をカットすることができ、私の – ElpieKay

+0

こんにちはこれもために/私にエラーを与えています/ remote_ref変数から? – Saurabhdv27

+0

ブランチを押すと 'local_ref'は' refs/heads/Mybranch'、 'remote_ref'は' refs/for/Mybranch'です。 | local_ref local_sha remote_ref remote_sha 行う remote_refを読みながら>> remote.txt \t remote_ref1 =猫remote.txtを: – ElpieKay

答えて

0

、あなたは、refs/heads/またはrefs/for/を仮定するべきではありません(refs/tags/)をプッシュし、おそらく他のプッシュ(例えば、引用文献/ノート/、 refs/stashなど)。

たとえば、git push there refs/heads/master:refs/for/something refs/tags/v1.2:refs/tags/v1.2 refs/remotes/origin/master:refs/heads/masterなどを実行して3つのプッシュを同時にリクエストできることに注意してください。プッシュプッシュフックのループ内のすべてのリクエストを読み取る必要があるのはこのためです。


あなたが使用しているコメントで提案されている:

remote_ref >> remote.txt 
remote_ref1 = cat remote.txt | cut -d'/' -f3 
rm remote.txt 

いくつかの構文エラーがあります。

それは接頭辞チェックに賢明だし、それはあなたが期待するものだと扱いたい場合、接頭を取り除きます。たとえば、feature/tallという名前のブランチを使用している場合、または最初の2つのコンポーネントを超える参照構造を使用している場合(リモートトラッキングブランチはこのように動作しますが、通常はそうですが)、3番目の単語を抽出しないでください。あなたはそれらをプッシュしないだろう)。

SH/bashスクリプト言語では、あなたが例えば、書くことができます。

case $local_ref in 
refs/heads/*) 
    local_type=branch 
    local_short=${local_ref#refs/heads/} 
    ;; 
*) 
    local_type=unknown 
    ;; 
esac 

case $remote_ref in 
refs/heads/*) 
    remote_type=branch 
    remote_short=${remote_ref#refs/heads/} 
    ;; 
refs/for/*) 
    remote_type=gerrit 
    remote_short=${remote_ref#refs/for/} 
    ;; 
*) 
    remote_type=unknown 
    ;; 
esac 

今、あなたは参照型をデコードし、知られている例のための短いバージョンを発見した、あなたはあなたのあたり-ケースロジックを記述することができていること、および後で適切に延長してください:

case $local_type,$remote_type in 
branch,branch|branch,gerrit) 
    # push from branch to branch, or from branch to gerrit: 
    # require that the shortened names match exactly (for now) 
    if [ $local_short != $remote_short ]; then 
     echo "push to $remote_type requires paired names" 1>&2 
     echo "but you are pushing from $local_short to $remote_short" 1>&2 
     exit 1 
    fi 
    ;; 
*) 
    # echo "unknown reference type - allowing" 1>&2 # uncomment for debug 
    ;; 
esac 

このすべては、メインのwhile read ...ループ内に入ります。ループの終わりにすると、すべてあなたが押している参照が検証されています(エコーと終了コードによって拒否されたものはありません)。

+0

受け入れ答えを行わ\t \t 1番出口 \t \t \t他 \t \t \t終了0 \t Fiを提供しています。 これについてあなたの助けを感謝し、それは私のために働いた。 remote_short = $ {remote_ref#headers} – Saurabhdv27

+0

シェルは、「変数置換」または「パラメータ拡張」の構文が慎重に定義されています(別のドキュメントこれに対して異なる用語を使用する)。 '$ var'が最も明白ですが、' $ x'の後ろに 'y'という文字を展開したいのですが?だから彼らには$ {x} yがあります。中括弧の内側では、それ以上の変更が可能です。詳細は1つのシェル(bash)から別のシェル(sh、ダッシュ、kshなど)までさまざまですが、すべて「$ {var#word}」をサポートしています。もっと多くのものがあります:特にbashの場合は、http://wiki.bash-hackers.org/syntax/pe – torek

+0

を参照してください。 – Saurabhdv27

関連する問題