web-dev-qa-db-ja.com

現在のgitブランチの名前をシェルスクリプトの変数に取得する方法は?

私はシェルスクリプトの初心者で、これを理解できません。慣れていない場合、コマンドgit branchは次のようなものを返します

* develop
  master

、ここでアスタリスクは現在チェックアウトされているブランチをマークします。ターミナルで次を実行すると:

git branch | grep "*"

私は得る:

* develop

予想通り。

ただし、実行すると

test=$(git branch | grep "*")

または

test=`git branch | grep "*"`

その後

echo $test

、結果はディレクトリ内のファイルのリストにすぎません。 test = "*開発"の値を作成するにはどうすればよいですか?

次に、次のステップ(「*開発」をtestという変数に入れたら)は、部分文字列を取得することです。それは単に次のことでしょうか?

currentBranch=${test:2} 

私はその部分文字列関数をいじっていましたが、「不正な置換」エラーが頻繁に発生しましたが、その理由はわかりません。

63
Ben

*は展開されます。できることは、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,')

(marcoが既に行ったように)拡張を詳しく説明するために、echo $test「*マスター」を含む$ testで、*は通常の展開ルールに従って展開されます。これを抑制するには、marcoが示すように変数を引用する必要があります:echo "$test"。あるいは、エコーする前にアスタリスクを取り除くと、すべてが正常になります。 echo ${test:2}は単に「マスター」をエコーし​​ます。別の方法として、既に提案したとおりに新たに割り当てることもできます。

branch=${test:2}
echo $branch

これは、望みどおりに「マスター」をエコーし​​ます。

81
wich

Noufal Ibrahim's answer を展開して、--shortフラグとgit-symbolic-refsedで大騒ぎする必要はありません。

私はフックでこのようなものを使用してきましたが、うまく機能します:

#!/bin/bash

branch=$(git symbolic-ref --short HEAD)

echo
echo "**** Running post-commit hook from branch $branch"
echo

「****ブランチマスターからのコミット後フックの実行」を出力します

ご了承ください git-symbolic-refは、リポジトリにいる場合にのみ機能します。幸いなことに.git/HEADは、Gitの初期の時代からの残り物として、同じシンボリック参照を含んでいます。ディレクトリを走査せずに、いくつかの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ハッシュを含むファイルへの相対パスでもあります。

80
joemaller

Gitコアでgit-symbolic-refコマンドを使用します。 git-symbolic-ref HEADと言うと、現在のブランチの名前が表示されます。

30
Noufal Ibrahim

Gitヘルパースクリプトでこのgit describe --contains --all HEADを使用します

例:

#!/bin/bash
branchname=$(git describe --contains --all HEAD)
git pull --rebase Origin $branchname

~/scriptsgpullというファイルにそれがあります

編集:

多くのCI環境では、「切り離されたヘッド」状態でコードをチェックアウトするため、以下を使用します。

BRANCH=$(\
  git for-each-ref \
  --format='%(objectname) %(refname:short)' refs/heads \
  | awk "/^$(git rev-parse HEAD)/ {print \$2}"\
)
13
NullVoxPopuli

問題は次のものに依存しています。

echo $test

実際、変数testには、シェルによって展開されるワイルドカードが含まれています。それを避けるには、二重引用符で$ testを保護するだけです:

echo "$test"
7
marco

サブシェルのグロブ展開を無効にし、

test=$(set -f; git branch)
1
Dyno Fu