次のいずれかを実行することで、現在のgitブランチ名を見つけることができます。
git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD
しかし、デタッチされたHEAD状態、たとえば Jenkins mavenビルドのポストビルドフェーズ(またはTravis git fetch)の場合、これらのコマンドは作業。
私の現在の作業解決策はこれです:
git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD
HEAD tipに最後のコミットがあるブランチ名を表示します。これは正常に動作しますが、git-fuがより強力な誰かがより良い解決策を持っていると思いますか?
より磁器的な方法:
git log -n 1 --pretty=%d HEAD
# or equivalently:
git show -s --pretty=%d HEAD
参照は(HEAD, master)
の形式でリストされます。これを人間が使用するのではなくスクリプトで使用する場合は、少し解析する必要があります。
自分でもう少しきれいに実装することもできます:
git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$(git rev-parse HEAD)/ {print \$2}"
候補の参照を別の行で取得するという利点があり、余分な文字はありません。
Jenkinsにはブランチのローカルコピーがないため、少し異なるソリューションが必要でした。したがって、現在のコミットはリモートブランチと照合する必要があります。
git ls-remote --heads Origin | grep $(git rev-parse HEAD) | cut -d / -f 3
またはネットワークなし:
git branch --remote --verbose --no-abbrev --contains | sed -rne 's/^[^\/]*\/([^\ ]+).*$/\1/p'
同じコミットで複数のブランチヘッドがある場合、複数のブランチ名が返される可能性があることにも注意してください。
更新:
JenkinsがGIT_BRANCH
のような値を含むOrigin/master
環境変数を設定することに気づきました。これはJenksinでgitブランチを取得するためにも使用できます。
echo $GIT_BRANCH | cut -d / -f 2
git branch --contains HEAD
明らかに破棄(ブランチなし)。もちろん、現在のHEAD(もちろん、no-branchに入った方法によっては何もない)を表す)を記述できる任意の数のブランチを取得する可能性があります。ローカルブランチ(常にgit merge --no-ff
を使用する必要がある多くの理由の1つ)。
git symbolic-ref HEAD
戻り値 refs/heads/branchname
ブランチにいる場合、ブランチにいない場合はエラー。
git nthlastcheckout
、最後のn回目のチェックアウトに使用した正確な文字列をreflogから取得します。
git config --global alias.nthlastcheckout '!nthlastcheckout'"() {
git reflog |
awk '\$3==\"checkout:\" {++n}
n=='\${1-1}' {print \$NF; exit}
END {exit n!='\${1-1}'}'
}; nthlastcheckout \"\$@\""
例:
$ git nthlastcheckout
master
$ git nthlastcheckout 2
v1.3.0^2