programing

현재 체크아웃된 Git 브랜치를 프로그래밍 방식으로 결정하는 방법

lovejava 2023. 4. 19. 21:49

현재 체크아웃된 Git 브랜치를 프로그래밍 방식으로 결정하는 방법

Unix 또는 GNU 스크립트 환경(Linux distro, Cygwin, OSX 등)에서 현재 작업 디렉토리에서 체크아웃된 Git 브랜치를 확인하는 가장 좋은 방법은 무엇입니까?

중 으로 라벨을 것입니다(예: " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""svnversion전복.

관련 질문도 참조해 주세요.Git 체크 아웃이 태그인지 아닌지를 프로그래밍 방식으로 판별하는 방법 및 만약 그렇다면 태그 이름은 무엇입니까?

올바른 해결책은 contributions/completions/git-completion.bash는 bash 프롬프트를 참조하는 것입니다.__git_ps1분리된 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"를 사용한다.


2013년 6월 11일 추가

Junio C.2013년 6월 10일부터 Hamano(git maintainer)의 블로그 투고 「현재의 지점을 프로그램적으로 확인」에서는, Whys(및 방법)에 대해 자세하게 설명합니다.

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

모드의 (regex "grep")-E할 수 있습니다. :) '*'가 존재하는지 확인할 수

 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

제가 하는 일은 다음과 같습니다.

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

출력은 다음과 같습니다.

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

아, 아, 아, 아, 아, 아, 아, 네.--no-color플레인 스트링을 되돌리는 경우 part가 중요하거나 중요할 수 있습니다.

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

그렇게 할 수 있는 정말 간단한 두 가지 방법을 찾았습니다.

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

그리고.

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

--portcelain을 사용하면 해석하기 쉬운 하위 호환 출력을 얻을 수 있습니다.

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

매뉴얼에서 다음 항목을 참조하십시오.

자기 포맷은 쇼트 포맷과 비슷하지만 Git 버전 간 또는 사용자 구성에 따라 역호환되지 않음을 보증합니다.따라서 스크립트에 의한 해석에 매우 적합합니다.

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

가장 간단하고 알기 쉬운 방법을 찾고 있습니다.

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

한 줄 변수 할당에서 수락된 답변과 동일한 결과:

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

어떤 분이 3개도 안 되는 숙제로 배쉬를 한다고 하셨는데...이렇게 복잡한 제어 흐름은 어떨까요?

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

이전 NT 명령줄을 사용하는 경우 다음을 사용할 수 있습니다.

@for /f "usebackq" %i in (`git symbolic-ref -q HEAD`) do @echo %~ni

배치 파일에서 사용하려면 %를 두 배로 늘려야 합니다.

@for /f "usebackq" %%i in (`git symbolic-ref -q HEAD`) do @echo %%~ni

PS1에서의 사용 또는 릴리스의 자동 라벨 부착에 적합한 솔루션을 다음에 나타냅니다.

지점에서 체크아웃한 경우 지점 이름을 얻을 수 있습니다.

init'd 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_treePS1의 다른 기능에서 사용하고 있습니다.여기서 풀로 보실 수 있습니다.git의 현재 브랜치색상이 있는 PS1 라인입니다.

그것이 하나의 해결책입니다..bashrc에 추가하면 콘솔에 현재 분기가 표시됩니다.

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

하지만 꽤 제한적입니다.하지만 git sh라고 불리는 훌륭한 프로젝트가 있습니다.그것은 바로 그것을 하고 있습니다(그리고 그 밖에도 더 많이 하고 있습니다).

특히 프롬프트를 업데이트 할 때 git 호출이 느리다는 것을 알게 되었습니다.시간은 최상위 머신(RAID 1, 8 GB RAM, 8 하드웨어 스레드)에서는 repo의 루트 디르 내에서 .1 ~.2초, repo 밖에서 .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@/[^/]*$@@;
}

좀 수정해야 할 것 같아

그래들을 사용한다면

```

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
            }

```

분리된 헤드에 있고(즉, 릴리스를 체크 아웃한 경우) 다음과 같은 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 명령어로 변경해야 합니다.

언급URL : https://stackoverflow.com/questions/1593051/how-to-programmatically-determine-the-current-checked-out-git-branch