web-dev-qa-db-ja.com

現在チェックアウトされているGitブランチをプログラムで決定する方法

UnixまたはGNUスクリプト環境(Linuxディストリビューション、Cygwin、OSXなど)で、どのGitブランチが現在作業中にチェックアウトされているかを判断する最良の方法は何ですかディレクトリ?

この手法の1つの使用法は、リリースに自動的にラベルを付けることです(svnversionがSubversionで行うように)。

関連する質問も参照してください: Gitチェックアウトがタグであるかどうかをプログラムで判断する方法と、タグがある場合はタグ名は何ですか

257
JasonSmith

正しい解決策は、 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)の詳細。

279
Jakub Narębski

Gitにあなたの現在のブランチを説明するように頼むことで、何か間違ったことを見ている人はいますか?

git rev-parse --symbolic-full-name --abbrev-ref HEAD

これは$()内で使用でき、Bash、Powershell、Perlなどで簡単に渡すことができます。コミットに複数のブランチがある場合、だまされません。現在ブランチにない場合は、単純に「HEAD」で返信します。

または、次を使用できます

git symbolic-ref --short -q HEAD

これにより、同じ出力が得られますが、切り離されても何も返されません。これは、切り離したときにエラーが発生する場合に便利です。-qを削除するだけです。

194

git name-rev --name-only HEADを使用できます

43
jonny

この答えから: https://stackoverflow.com/a/1418022/605356

$ git rev-parse --abbrev-ref HEAD
master

どうやらGit 1.6.3以降で動作するようです。

34
Johnny Utahh

で試してください:

 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;
19
fitorec

受け入れられた答えをWindows PowerShellに適応させる:

Split-Path -Leaf (git symbolic-ref HEAD)
10
tjb

これはbashファイルで私のために働いた。

git branch | grep '^*' | sed 's/* //'  


################bash file###################
#!/bin/bash
BRANCH=$(git branch | grep '^*' | sed 's/* //' )
echo $BRANCH
8
muhammed basil

これは私のために動作します。 --no-color部分は、単純な文字列を戻す場合に重要です。

git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
6
August Lilleaas

私はここで最も簡単で自明な方法を試しています:

git status | grep "On branch" | cut -c 11-
5
tonywoode

そのための2つの簡単な方法を見つけました。

$ git status | head -1 | cut -d ' ' -f 4

そして

$ git branch | grep "*" | cut -d ' ' -f 2
4
silvansky

ここに私がやることがあります:

git branch | sed --quiet 's/* \(.*\)/\1/p'

出力は次のようになります。

$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$
4
JasonSmith

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行

2
polypus74

古い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
2
Peter Hart

--porcelainを使用すると、後方互換性のある出力が解析しやすくなります。

git status --branch --porcelain | grep '##' | cut -c 4-

ドキュメントから:

磁器の形式は短い形式に似ていますが、Gitのバージョン間またはユーザーの構成に基づいて後方互換性のない方法で変更しないことが保証されています。これにより、スクリプトによる解析に最適です。

https://git-scm.com/docs/git-status

2
Tony Baguette

誰かが3つ未満の割り当てでbashでそれをやっていると言いました...このような厄介な制御フローはどうですか:

branch_name="$(b=$(git symbolic-ref -q HEAD); { [ -n "$b" ] && echo ${b##refs/heads/}; } || echo HEAD)"
2
qneill

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
ravikanth

1行の変数割り当てで受け入れられた回答と同じ結果:

branch_name=$((git symbolic-ref HEAD 2>/dev/null || echo "(unnamed branch)")|cut -d/ -f3-)
1
Kim Taylor

切り離されたヘッド(つまり、リリースをチェックアウトした)にいて、次のような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コマンドの引数を変更する必要があります。

0
Steve Childs

特にプロンプ​​トを更新する場合、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;
                        [email protected]: refs/heads/@@;
                        print $_;
                };
                exit;
        };

        [email protected]/[^/]*[email protected]@;
}

微調整が必​​要な場合があります。

0
Kenney

それが一つの解決策です。 .bashrcに追加すると、現在のブランチがコンソールに表示されます。

# git branch
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
$PS1="\$(parse_git_branch)$PS1"

しかし、それはかなり制限されています。しかし、 git sh と呼ばれる素晴らしいプロジェクトがあり、それはまさに(そしてそれ以上)を行っています。

0
Damien MATHIEU