60

次のいずれかを実行して、現在の git ブランチ名を見つけることができます。

git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD

しかし、 Jenkins Maven ビルド (または Travis git fetch) のビルド後のフェーズなど、切り離された HEAD 状態の場合、これらのコマンドは機能しません。

私の現在の作業ソリューションは次のとおりです。

git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD

HEAD ヒントに最後のコミットがあるブランチ名が表示されます。これはうまくいきますが、より強力な git-fu を持っている人はもっときれいな解決策を持っているのではないでしょうか?

4

7 に答える 7

53

より磁器の方法:

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}"

余分な文字なしで、候補の参照を別々の行で取得できるという利点があります。

于 2011-05-19T20:02:58.427 に答える
38

ブランチのローカル コピーがないため、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'

同じコミットで複数のブランチ ヘッドがある場合、複数のブランチ名が返される可能性があることにも注意してください。

アップデート:

GIT_BRANCHJenkinsが のような値を含む環境変数を設定していることに気付きましたorigin/master。これは、Jenksin で git ブランチを取得するためにも使用できます。

echo $GIT_BRANCH | cut -d / -f 2
于 2013-10-18T18:59:54.040 に答える
12
git branch --contains HEAD

明らかに破棄します(ブランチなし)。もちろん、ローカルブランチに早送りでマージされた可能性のある現在のHEADを説明できる任意の数のブランチを取得する可能性があります(もちろん、ブランチなしに移行した方法によっては何も含まれません)(多くの理由の1つ)常に使用する必要がある理由git merge --no-ff)。

于 2011-05-20T02:02:37.853 に答える
1

ここでgit nthlastcheckoutは、reflog から n 番目の最後のチェックアウトに使用した正確な文字列を取得します。

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
于 2015-02-07T01:20:55.080 に答える