私はシェルスクリプトの初心者で、これを理解できません。慣れていない場合、コマンドgit branchは次のようなものを返します
* develop
master
、ここでアスタリスクは現在チェックアウトされているブランチをマークします。ターミナルで次を実行すると:
git branch | grep "*"
私は得る:
* develop
予想通り。
ただし、実行すると
test=$(git branch | grep "*")
または
test=`git branch | grep "*"`
その後
echo $test
、結果はディレクトリ内のファイルのリストにすぎません。 test = "*開発"の値を作成するにはどうすればよいですか?
次に、次のステップ(「*開発」をtestという変数に入れたら)は、部分文字列を取得することです。それは単に次のことでしょうか?
currentBranch=${test:2}
私はその部分文字列関数をいじっていましたが、「不正な置換」エラーが頻繁に発生しましたが、その理由はわかりません。
*は展開されます。できることは、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
これは、望みどおりに「マスター」をエコーします。
Noufal Ibrahim's answer を展開して、--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の初期の時代からの残り物として、同じシンボリック参照を含んでいます。ディレクトリを走査せずに、いくつかの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ハッシュを含むファイルへの相対パスでもあります。
Gitコアでgit-symbolic-ref
コマンドを使用します。 git-symbolic-ref HEAD
と言うと、現在のブランチの名前が表示されます。
Gitヘルパースクリプトでこのgit describe --contains --all HEAD
を使用します
例:
#!/bin/bash
branchname=$(git describe --contains --all HEAD)
git pull --rebase Origin $branchname
~/scripts
のgpull
というファイルにそれがあります
多くのCI環境では、「切り離されたヘッド」状態でコードをチェックアウトするため、以下を使用します。
BRANCH=$(\
git for-each-ref \
--format='%(objectname) %(refname:short)' refs/heads \
| awk "/^$(git rev-parse HEAD)/ {print \$2}"\
)
問題は次のものに依存しています。
echo $test
実際、変数testには、シェルによって展開されるワイルドカードが含まれています。それを避けるには、二重引用符で$ testを保護するだけです:
echo "$test"
サブシェルのグロブ展開を無効にし、
test=$(set -f; git branch)