UnixまたはGNUスクリプト環境(Linuxディストリビューション、Cygwin、OSXなど)で、どのGitブランチが現在作業中にチェックアウトされているかを判断する最良の方法は何ですかディレクトリ?
この手法の1つの使用法は、リリースに自動的にラベルを付けることです(svnversion
がSubversionで行うように)。
関連する質問も参照してください: Gitチェックアウトがタグであるかどうかをプログラムで判断する方法と、タグがある場合はタグ名は何ですか
正しい解決策は、 contrib/completions/git-completion.bash を覗いて、__git_ps1
のbashプロンプトを確認することです。切り離されたHEAD状況の記述方法の選択など、余分なものをすべて削除します。つまり、名前のないブランチにいるときは、次のようになります。
branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)" # detached HEAD
branch_name=${branch_name##refs/heads/}
git symbolic-ref は、シンボリック参照から完全修飾ブランチ名を抽出するために使用されます。現在チェックアウトされているブランチであるHEADに使用します。
代替ソリューションは次のとおりです。
branch_name=$(git symbolic-ref -q HEAD)
branch_name=${branch_name##refs/heads/}
branch_name=${branch_name:-HEAD}
最後の行では、分離されたHEAD状況を扱います。このような状況を示すために単に「HEAD」を使用します。
11-06-2013を追加
Junio C. Hamano(gitメンテナー)ブログ投稿、 現在のブランチをプログラムでチェックする 、2013年6月10日からwhys(およびhows)の詳細。
Gitにあなたの現在のブランチを説明するように頼むことで、何か間違ったことを見ている人はいますか?
git rev-parse --symbolic-full-name --abbrev-ref HEAD
これは$()内で使用でき、Bash、Powershell、Perlなどで簡単に渡すことができます。コミットに複数のブランチがある場合、だまされません。現在ブランチにない場合は、単純に「HEAD」で返信します。
または、次を使用できます
git symbolic-ref --short -q HEAD
これにより、同じ出力が得られますが、切り離されても何も返されません。これは、切り離したときにエラーが発生する場合に便利です。-qを削除するだけです。
git name-rev --name-only HEAD
を使用できます
この答えから: https://stackoverflow.com/a/1418022/605356 :
$ git rev-parse --abbrev-ref HEAD
master
どうやらGit 1.6.3以降で動作するようです。
で試してください:
git symbolic-ref --short -q HEAD
または、git branch
で--no-color
を使用して、単純なプレーン文字列を強制的に出力します。
git branch --no-color
正規表現モード(-E
)でgrepを使用すると、文字「*」が存在するかどうかを確認できます。
git branch --no-color | grep -E '^\*'
結果は次のようになります。
* currentBranch
次のオプションを使用できます。
sed 's/\*[^a-z]*//g'
cut -d ' ' -f 2
awk '{print $2}'
例えば:
git branch --no-color | grep -E '^\*' | sed 's/\*[^a-z]*//g'
git branch --no-color | grep -E '^\*' | sed cut -d ' ' -f 2
git branch --no-color | grep -E '^\*' | awk '{print $2}'
エラーが存在する場合、デフォルト値を使用できません:
cmd || echo 'defualt value';
Bash関数のすべて:
function get_branch() {
git branch --no-color | grep -E '^\*' | awk '{print $2}' \
|| echo "default_value"
# or
# git symbolic-ref --short -q HEAD || echo "default_value";
}
branch_name=`get_branch`;
echo $branch_name;
受け入れられた答えをWindows PowerShellに適応させる:
Split-Path -Leaf (git symbolic-ref HEAD)
これはbashファイルで私のために働いた。
git branch | grep '^*' | sed 's/* //'
################bash file###################
#!/bin/bash
BRANCH=$(git branch | grep '^*' | sed 's/* //' )
echo $BRANCH
これは私のために動作します。 --no-color
部分は、単純な文字列を戻す場合に重要です。
git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
私はここで最も簡単で自明な方法を試しています:
git status | grep "On branch" | cut -c 11-
そのための2つの簡単な方法を見つけました。
$ git status | head -1 | cut -d ' ' -f 4
そして
$ git branch | grep "*" | cut -d ' ' -f 2
ここに私がやることがあります:
git branch | sed --quiet 's/* \(.*\)/\1/p'
出力は次のようになります。
$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$
PS1での使用、またはリリースへの自動ラベル付けに適した私のソリューションを次に示します。
ブランチでチェックアウトされている場合、ブランチ名を取得します。
初期化されたgitプロジェクトにいる場合は、「@」を取得します
頭のない人は、名前の前に '@'が付いた、ブランチまたはタグに関連するニースの人間名を取得します。
ヘッドレスで、ブランチやタグの先祖ではない場合は、短いSHA1を取得するだけです。
function we_are_in_git_work_tree {
git rev-parse --is-inside-work-tree &> /dev/null
}
function parse_git_branch {
if we_are_in_git_work_tree
then
local BR=$(git rev-parse --symbolic-full-name --abbrev-ref HEAD 2> /dev/null)
if [ "$BR" == HEAD ]
then
local NM=$(git name-rev --name-only HEAD 2> /dev/null)
if [ "$NM" != undefined ]
then echo -n "@$NM"
else git rev-parse --short HEAD 2> /dev/null
fi
else
echo -n $BR
fi
fi
}
必要に応じて、if we_are_in_git_work_tree
ビットを削除できます。私はPS1の別の関数でそれを使用するだけで、ここで完全に表示できます: git current branch and colorsを含むPS1行
古いNTコマンドラインを使用している場合は、次を使用できます。
@for /f "usebackq" %i in (`git symbolic-ref -q HEAD`) do @echo %~ni
バッチファイルで使用するには、%を2倍にする必要があります。
@for /f "usebackq" %%i in (`git symbolic-ref -q HEAD`) do @echo %%~ni
--porcelainを使用すると、後方互換性のある出力が解析しやすくなります。
git status --branch --porcelain | grep '##' | cut -c 4-
ドキュメントから:
磁器の形式は短い形式に似ていますが、Gitのバージョン間またはユーザーの構成に基づいて後方互換性のない方法で変更しないことが保証されています。これにより、スクリプトによる解析に最適です。
誰かが3つ未満の割り当てでbashでそれをやっていると言いました...このような厄介な制御フローはどうですか:
branch_name="$(b=$(git symbolic-ref -q HEAD); { [ -n "$b" ] && echo ${b##refs/heads/}; } || echo HEAD)"
Gradleを使用している場合、
`` `
def gitHash = new ByteArrayOutputStream()
project.exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = gitHash
}
def gitBranch = new ByteArrayOutputStream()
project.exec {
def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d' -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
commandLine "bash", "-c", "${gitCmd}"
standardOutput = gitBranch
}
`` `
1行の変数割り当てで受け入れられた回答と同じ結果:
branch_name=$((git symbolic-ref HEAD 2>/dev/null || echo "(unnamed branch)")|cut -d/ -f3-)
切り離されたヘッド(つまり、リリースをチェックアウトした)にいて、次のようなgitステータスからの出力がある場合
HEAD detached at v1.7.3.1
リリースバージョンが必要な場合は、次のコマンドを使用します...
git status --branch | head -n1 | tr -d 'A-Za-z: '
これにより1.7.3.1が返され、parameters.yml(Symfony)で置き換えられます
# RevNum=`svn status -u | grep revision | tr -d 'A-Za-z: '` # the old SVN version
RevNum=`git status --branch | head -n1 | tr -d 'A-Za-z: '` # Git (obvs)
sed -i "/^ app_version:/c\ app_version:$RevNum" app/config/parameters.yml
これが役立つことを願っています:)ブランチ名に非数値が含まれている場合は、明らかに、trコマンドの引数を変更する必要があります。
特にプロンプトを更新する場合、gitの呼び出しはかなり遅い(サブコマンドのいずれか)ことがわかりました。リポジトリのルートディレクトリ内では.1秒から.2秒の間、トップノッチマシン(RAID 1、8 GBのRAM、8つのハードウェアスレッド)では.2秒を超えます。ただし、Cygwinは実行されます。
したがって、速度のためにこのスクリプトを作成しました。
#!/usr/bin/Perl
$cwd=$ENV{PWD}; #`pwd`;
chomp $cwd;
while (length $cwd)
{
-d "$cwd/.git" and do {
-f "$cwd/.git/HEAD" and do {
open IN, "<", "$cwd/.git/HEAD";
$_=<IN>;
close IN;
s@ref: refs/heads/@@;
print $_;
};
exit;
};
$cwd=~s@/[^/]*$@@;
}
微調整が必要な場合があります。
それが一つの解決策です。 .bashrcに追加すると、現在のブランチがコンソールに表示されます。
# git branch
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
$PS1="\$(parse_git_branch)$PS1"
しかし、それはかなり制限されています。しかし、 git sh と呼ばれる素晴らしいプロジェクトがあり、それはまさに(そしてそれ以上)を行っています。