* が展開されます。できることは、grep の代わりに sed を使用して、すぐにブランチの名前を取得することです:
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
Noufal Ibrahim が提案するように、git symbolic-ref を使用するバージョン
branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
展開について詳しく説明すると、(マルコが既に行ったように) echo $test
を実行すると、エコーで展開が行われます。 $test
で * master
を含む 次に *
通常の展開ルールに従って展開されます。これを抑制するには、マルコが示すように、変数を引用符で囲む必要があります:echo "$test"
.または、エコーする前にアスタリスクを取り除くと、すべて問題ありません。 echo ${test:2}
master
をエコーするだけです .あるいは、すでに提案したように、新たに割り当てることもできます:
branch=${test:2}
echo $branch
これは master
をエコーします 、あなたが望むように。
git-symbolic-ref
を使用します git コアのコマンド。 git-symbolic-ref HEAD
と言ったら 、現在のブランチの名前を取得します。
Noufal Ibrahim の回答を拡張して、 --short
を使用します git-symbolic-ref
のフラグ 、 sed
で大騒ぎする必要はありません .
私はフックでこのようなものを使用しており、うまく機能します:
#!/bin/bash
branch=$(git symbolic-ref --short HEAD)
echo
echo "**** Running post-commit hook from branch $branch"
echo
それは、「**** ブランチ マスターからポストコミット フックを実行しています」と出力します
git-symbolic-ref
に注意してください リポジトリにいる場合にのみ機能します。幸いなことに .git/HEAD
Git の初期の名残として、同じシンボリック ref が含まれています。ディレクトリをトラバースせずに、複数の git リポジトリのアクティブ ブランチを取得する場合は、次のような bash ワンライナーを使用できます。
for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} : ${branch##*/}; done
次のようなものを出力します:
repo1 : master
repo2 : dev
repo3 : issue12
さらに進みたい場合は、.git/HEAD
に含まれる完全な参照 ブランチの最後のコミットの SHA-1 ハッシュを含むファイルへの相対パスでもあります。