にプッシュするプッシュプッシュフックのコンテキストでプッシュされているブランチのリストを取得するにはどうすればよいですか?現在のブランチを取得する方法は分かっていますが、プッシュされているブランチとは異なる場合があります。gitプリプッシュフック:ブランチを
私はコマンドの構文解析を考えましたが、私はいくつかのケースを忘れるかもしれないと心配しています。同様git push
、git push origin master
は両方習得するプッシュしますなど
にプッシュするプッシュプッシュフックのコンテキストでプッシュされているブランチのリストを取得するにはどうすればよいですか?現在のブランチを取得する方法は分かっていますが、プッシュされているブランチとは異なる場合があります。gitプリプッシュフック:ブランチを
私はコマンドの構文解析を考えましたが、私はいくつかのケースを忘れるかもしれないと心配しています。同様git push
、git push origin master
は両方習得するプッシュしますなど
while read oldrev newrev refname
do
if [[ "$newrev" != "0000000000000000000000000000000000000000" ]] ; then
branch=${refname#refs/heads/}
fi
done
それはあなたがリモートブランチやタグ名、および/またはローカル参照して何をしたいのか私にははっきりしていないが、ここでは一つの可能なループは、です:
#! /bin/sh
NULLSHA=0000000000000000000000000000000000000000 # 40 0's
say() {
echo "[email protected]" 1>&2
}
while read localref localhash foreignref foreignhash; do
case $foreignref in
refs/heads/*)
reftype=branch
shortref=${foreignref#refs/heads/};;
refs/tags/*)
reftype=tag
shortref=${foreignref#refs/tags/};;
*) reftype=unknown-ref-type
shortref=$foreignref;;
esac
say "pushing to $reftype $shortref"
case $localhash,$foreignhash in
$NULLSHA,*) say "(push with intent to delete)";;
*,$NULLSHA) say "(push with intent to create)";;
*) say "(push with intent to update from $foreignhash to $localhash)"
# for branch updates only, let's see if it's a fast-forward
if [ $reftype = branch ]; then
if git merge-base --is-ancestor $foreignhash $localhash; then
say "(this is a fast-forward)"
else
say "(this can only work if forced)"
fi
fi;;
esac
done
(注:これは十分にテストされていません)。
閉じるが正しくはない:gitフックのドキュメントのpre-push hookセクションの 'refs/heads/master 67890 refs/heads/foreign 12345'の例を見てください:https://www.kernel.org/ pub/software/scm/git/docs/githooks.html – torek
'$(echo $ {refname#refs/heads /} | awk '{print $ 1;}') '' 'のように見えるので、動作します – Guig
@Guig:simpler : '読み込み中localhash foreignref foreignhash; 'refs/heads /'で始まる 'refname'(' localref'と改名する)も実際には 'refs/heads /'で始まっていることを確認する必要があります。そうでなければタグ 'v1.2'を押すと*ブランチ* 'v1.2'はおそらく存在しません。 – torek