로컬 자식 분기가 있는지 확인하는 더 좋은 방법이 있습니까?


191

다음 명령을 사용하여 로컬 git 브랜치 branch-name가 내 저장소에 있는지 확인합니다. 이 올바른지? 더 좋은 방법이 있습니까?

스크립트 내 에서이 작업을 수행하고 있습니다. 이러한 이유로 가능한 경우 배관 명령사용 하고 싶습니다 .

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 

당신의 명령은 내가 사용한 명령처럼 보입니다.
Paŭlo Ebermann

6
내 무지에서 나는 함께 갔다 git branch | grep -w <branch-name>. 좋아, 그것은 도자기 명령이지만,이 스 니펫을 사용할 수 없게하기 위해
앞으로이

@ UncleZeiv : 명령을 사용할 수 없도록 크게 변경되지 않았을 것입니다. 나는 도자기 대 배관과 같은 것들에 대해 약간의 OCD를 가지고 있습니다.
Manoj Govindan

10
git rev-parse --verify <branch_name>태그 및 커밋 해시와 같은 다른 참조도 확인하므로 필요한 것에 더 적합 할 수 있지만 분기에만 정확하게 관심이 있으면 오 탐지를 반환합니다.
Paul S.

2
git show-ref만이 LOCAL 분기가 있는지 확인하기 위해 작동합니다. 업데이트 (git rev-parse를 사용한 구문)에서 원격 분기가 일치하면 리턴 코드도 0입니다.
Fabien Bouleau

답변:


57

내가 아는 한, 그것은 스크립트에서 그것을하는 가장 좋은 방법입니다. 거기에 더 많은 내용이 있는지는 확실하지 않지만 "그 명령이 원하는 모든 것을 수행합니다"라는 답이있을 수 있습니다. :)

주의해야 할 유일한 것은 브랜치 이름에 놀라운 문자가있을 수 있으므로 인용 할 수 있다는 것 <branch-name>입니다.


1
인용에 대한 좋은 지적 <branch-name>. FWIW 패브릭 스크립트에서 이것을 사용하고 있습니다. 변수를 인용하는 것을 기억할 것입니다.
Manoj Govindan

정답은 암시 적으로 다음과 같습니다. git show-ref --verify --quiet refs / heads / <branch-name>은 HEAD가 올바르게 분기되지 않았 음을 나타냅니다. git rev-parse --verify는 HEAD가 기존 브랜치임을 알려줍니다. HEAD가 분기가 아니므로 False입니다.
Paulo Neves

106

검색 엔진에서 '지점이 있는지 확인하십시오'를 검색하면이 페이지가 처음입니다.

원하는 것을 얻었지만 원래 게시물이 2011 년 이후로 업데이트 된 답변을 제공하고 싶습니다.

git rev-parse --verify <branch_name>

이것은 기본적으로 허용되는 답변과 동일하지만 "refs / heads /"를 입력 할 필요는 없습니다.


20
참고 사항 : git rev-parse --verify그러한 객체가 저장소에 존재하는지 알려줍니다 (즉, 값 <branch_name>이 저장소에있는 모든 유형의 객체로 변환되면 0을 반환 합니다). 해당 객체가 분기인지 여부는 알려주지 않습니다.
tavnab

9
이것은 질문에 대한 정답이 아니며, 지사가 있는지 여부를 묻는 방법입니다. 이렇게하면 태그에 대해 오 탐지가됩니다. 이것을 직접 테스트 할 수 있습니다. 심판 / 태그에있는 태그, 심지어 심판 / 원격에있는 원격 태그까지 구별하려면 심판 / 헤드 /가 필요합니다.
msouth

15
자식 레브 - 구문 분석은 --verify GH-페이지 나 제공 : 치명적 : 필요한 하나의 개정을
SuperUberDuper

@SuperUberDuper 당신은 시도 : git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack

32

거의 다 왔어.

그냥 밖으로 떠날 --verify--quiet와 그렇지 않은 경우는 어느 지점이있는 경우 해시 또는 아무것도를 얻을.

변수에 지정하고 빈 문자열을 확인하십시오.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi

10
반환 값은 충분합니다. 변수에 할당하기 위해 오류가 발생하기 쉬운 노력을 기울일 필요가 없습니다.
msouth

15

나는 당신이 git show-branch여기서 사용할 수 있다고 생각합니다 .

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

그래서, $? == 0은 브랜치가 존재 함을 나타내며 심판 / 헤드 /의 배관을 전혀 파헤칠 필요가 없습니다. -rshow-branch에 전달하지 않는 한 로컬 브랜치에서만 작동합니다.


5
AFAIK git show-branch도자기 명령입니다. 내 질문에서 말했듯이 배관에 해당하는 것이 있으면 스크립트에서 도자기 명령을 사용하지 않는 것이 좋습니다. kernel.org/pub/software/scm/git/docs
Manoj Govindan

3
@Manoj : 나는 도자기 대 배관에 대해 알고 있지만 배관이 도자기보다 더 안정적인 것으로 여겨지는 것을 결코 읽지 못했습니다. 문서에서 저를 지적 해 주셔서 감사합니다.
Mark Drago

실수로 태그를 찾는 피하기 위해, 그리고 분기가 로컬 또는 원격 사용자가 지정 할 수 있는지 여부에 대한 자세한 구체적으로 git show-branch refs/heads/[branch]git show-branch refs/remotes/origin/[branch].
twasbrillig

14

나는 추천한다 git show-ref --quiet refs/heads/$name.

  • --quiet 출력이 없다는 것을 의미합니다. 종료 상태를 깨끗하게 확인할 수 있기 때문에 좋습니다.

  • refs/heads/$name현지 지사로 제한하고 전체 이름과 일치 (그렇지 않으면 dev일치합니다 develop)

스크립트에서의 사용법 :

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi

그렇습니다. 이것은 조용히하는 유일한 것입니다. 자식 명령어 명명은 TBH 비트 괴짜 인
smac89

11

스크립트에서 사용하기 위해 :

git show-ref -q --heads <branch-name>

로컬 브랜치로 존재하는 0경우에만 종료 됩니다 <branch-name>.

예:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi

2

Windows 배치 스크립트에서는 약간 다릅니다.

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)

1

호출 해 봅시다 git is_localbranch(에 별칭을 추가해야합니다 .gitconfig).

용법:

$ git is_localbranch BRANCH

출처:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi

1

초기 질문의 '업데이트'에 대한 '제안 편집'에 대한 검토 결과는 '댓글 또는 답변으로 작성되어야합니다'이므로 여기에 게시하겠습니다.

다른 방법 가지 있지만 같은 이름을 가진 모든 참조 확인합니다뿐만 아니라 제안 @jhuynh을 .

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

초기 중지시 '업데이트'문제에 대한 설명 :

'master.000'이 태그 일 뿐이라고 가정하고 확인하십시오. 그러한 로컬 브랜치는 존재하지 않습니다. grep은 하나의 항목을 리턴합니다 wchich는 태그입니다. 이러한 로컬 브랜치가 존재하지 않더라도 참조가 존재하면 여전히 rev-parse는 0을 리턴합니다. 이것은 @ paul-s가 언급 한 것과 정확히 일치하지 않습니다.

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0



0

내 경우 git show-ref에도 git rev-parse작동 하지 않습니다 .

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

나는 이것으로 끝났다

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

스크립트 파일로도 할 수 있습니다

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi

-1

grep을 포함시킬 수 있다면.

git branch | grep -q <branch>

1
점이 grep메타 문자로 해석되기 때문에 때로는 분기와 같이 지점 이름에 점 ( ".")을 사용하면 잘못된 대답을 줄 수 있습니다 .
피터 존 Acklam

1
또한 이름이 실제 분기의 하위 문자열 인 분기를 테스트하면 오 탐지가 발생합니다. 예를 들어 abc이라는 지점이 있으면 일치합니다 abcdef.
rjmunro

-1

스크립트에서 사용하려면 다음 명령을 권장합니다.

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

참고 <repo_url>단지가 될 수 있습니다 "." 디렉토리 구조, 로컬 저장소의 경로 또는 원격 저장소의 주소 내에있는 경우 로컬 저장소를 지정합니다.

<branch_name>존재하지 않으면 1이 없으면 명령은 0을 리턴합니다 .


-1
git branch --list $branch_name | grep $branch_name

그런 다음 반환 값이 0 또는 1인지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.