지정된 원격 저장소에 원격 분기가 있는지 확인하는 방법은 무엇입니까?


106

주어진 원격 저장소에있는 경우 특정 분기에 대해 하위 트리 병합을 수행해야합니다. 문제는 원격 저장소가 로컬로 체크 아웃되지 않았기 때문에 git branch -r. 내가 가진 것은 원격 주소뿐입니다 https://github.com/project-name/project-name.git. 원격 주소로 원격 분기를 나열하는 방법이 있습니까? 유용한 정보를 찾을 수 없습니다.

답변:


124
$ git ls-remote --heads git@github.com:user/repo.git branch-name

branch-name발견되는 경우 다음과 같은 출력이 표시됩니다.

b523c9000c4df1afbd8371324083fef218669108        refs/heads/branch-name

그렇지 않으면 출력이 전송되지 않습니다.

따라서 파이프를 연결 wc하면 1또는 0다음 이 제공됩니다 .

$ git ls-remote --heads git@github.com:user/repo.git branch-name | wc -l

또는 일치하는 참조가없는 경우 종료 코드 를 반환하는 --exit-code플래그를 설정할 수 있습니다 . 이것은 가장 관용적 인 솔루션입니다. 결과는 쉘 테스트에서 직접 확인하거나 상태 변수를 확인하여 확인할 수 있습니다.git ls-remote2$?

$ git ls-remote --exit-code --heads  git@github.com:user/repo.git branch-name

7
내가 사용하는 git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null다음if [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
sibaz

1
나는 몇 시간 동안 깔끔하고 정확한 대답을 찾고있었습니다.
MEDIK

분기 이름을 /refs/heads/branch-name. 그렇지 않으면가 foo/branch-name없는 경우에도 분기 가 반환됩니다 branch-name.
FuzzY

'Great Answer'골드 배지를 축하합니다. :)
jmort253

4
참고 : repo URL을 지정하지 않으려면 대신 repo 원격 이름을 지정할 수 있습니다. 예 :git ls-remote --heads origin branch-name
daveruinseverything

50
git ls-remote --heads https://github.com/rails/rails.git
5b3f7563ae1b4a7160fda7fe34240d40c5777dcd    refs/heads/1-2-stable
81d828a14c82b882e31612431a56f830bdc1076f    refs/heads/2-0-stable
b5d759fd2848146f7ee7a4c1b1a4be39e2f1a2bc    refs/heads/2-1-stable
c6cb5a5ab00ac9e857e5b2757d2bce6a5ad14b32    refs/heads/2-2-stable
e0774e47302a907319ed974ccf59b8b54d32bbde    refs/heads/2-3-stable
13ad87971cc16ebc5c286b484821e2cb0fc3e3b1    refs/heads/3-0-stable
3df6c73f9edb3a99f0d51d827ef13a439f31743a    refs/heads/3-1-stable
f4db3d72ea564c77d5a689b850751ce510500585    refs/heads/compressor
c5a809e29e9213102351def7e791c3a8a67d7371    refs/heads/deps_refactor
821e15e5f2d9ef2aa43918a16cbd00f40c221e95    refs/heads/encoding
8f57bf207ff4f28fa8da4544ebc573007b65439d    refs/heads/master
c796d695909c8632b4074b7af69a1ef46c68289a    refs/heads/sass-cleanup
afd7140b66e7cb32e1be58d9e44489e6bcbde0dc    refs/heads/serializers

ls-remote도 몰랐습니다. 감사합니다!
Keen

7
bash 스크립트에서 테스트를 수행해야했기 때문에 종료 코드에만 관심이 있었기 때문에 로컬 클론에서 다음을 수행했습니다 . 테스트 피연산자 git ls-remote --exit-code . origin/branch-name &> /dev/null로 사용 $?되었습니다
Darren Bishop

5
@Darren은에서와 같이 조건부에서 직접 명령을 사용하는 것만으로도 if git ls-remote ...; then ...; fi검사 $?(기록 문, 트랩 등으로 변경할 수 있음) 보다 오류가 덜 발생 합니다.
Charles Duffy 2014 년

--heads?
Steve

@JohnLinux --heads는 브랜치 만 나열합니다. --tags태그 만 나열 하는 데 사용 합니다.
rymo

19

실행할 git repo 인 경우 현재 폴더에서 사용할 수있는 또 다른 방법

git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'

2
큰 따옴표를 사용 :git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
이반

3
기존 브랜치 이름의 일부만 일치했지만 대상 브랜치와 정확히 일치하지 않은 경우에도 true를 반환하므로 최적이 아닙니다. 따라서 체크 아웃하기 전에 브랜치가 존재하는지 테스트하기 위해 스크립트에서 안전하게 사용할 수 없습니다. 어쨌든 유용하다고 생각했기 때문에 공유해 주셔서 감사합니다. 다음과 같이 수정할 수 있습니다.git branch -a | grep "\b${BRANCH}$"
EntangledLoops

2
git fetch사용하는 경우 git branch -a모든 원격 참조를 먼저 가져옵니다. 그렇지 않으면 git ls-remote다른 사람이 지적한대로 사용 합니다.
hIpPy

git branch -a --list '<pattern>'또한 옵션입니다. 스크립트에 대한 리턴 코드가 필요한 경우 grep에 파이프하십시오.
LOAS

17

다음을 사용할 수도 있습니다.

git show-branch remotes/origin/<<remote-branch-name>>

$?의 최신 커밋과 값을 반환합니다. 값이 0이면 "심각 : 불량 sha1 참조 원격 / 원점 / <>"및 $? 128입니다


이것은 확인하기 전에 원격에서 분기를 가져 오지 않으므로 최신 원격 상태를 얻지 못합니다.
siemanko 19

11

Bash 터미널에서 이와 같이 할 수 있습니다. 에코를 실행하려는 명령으로 바꾸십시오.

if git ls-remote https://username:password@github.com/project-name/project-name.git | grep -sw "remote_branch_name" 2>&1>/dev/null; then echo "IT EXISTS..START MERGE" ; else echo "NOT FOUND" ; fi

도움이되기를 바랍니다.


1
나는 그것을 좋아한다. 다른 답변에도 ls-remote가 있습니다. 내가 좋아하는 것은 "if"입니다.
Stony

11

그러면 매번 수동으로 저장소 이름을 전달할 필요가 없습니다.

git ls-remote origin <branch>

대신에

git ls-remote <full repo url> <branch>

예 :

git ls-remote git@bitbucket.org:landmarkgroupme/in-store-application.git  uat_21dec

또는

git ls-remote origin uat_21dec

둘 다 동일한 출력을 제공합니다.

여기에 이미지 설명 입력

Origin에 대한 추가 정보 : Git에는 단순히 저장소의 다른 사본에 대한 URL 인 "원격"이라는 개념이 있습니다. 다른 저장소를 복제 할 때 Git은 자동으로 "origin"이라는 이름의 원격을 생성하고이를 가리 킵니다. git remote show origin을 입력하면 리모컨에 대한 자세한 정보를 볼 수 있습니다.


11

여기에있는 모든 답변은 Linux 셸 전용이며, 이러한 종류의 작업을 지원하지 않는 환경 (예 : Windows의 명령 프롬프트)에있는 경우 그다지 도움이되지 않습니다.

다행히 분기의 존재 여부에 따라 각각 0 또는 2를 반환 git ls-remote하는 --exit-code인수를 허용합니다 . 그래서:

git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>

0을 반환하고

git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>

2를 반환합니다.

PowerShell의 경우 기본 제공 진리 처리 의미 체계를 간단히 사용할 수 있습니다.

if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }

수익률은 다음 $true과 같습니다.

if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }

수익률 $false.


6
$ git ls-remote --heads origin <branch> | wc -l

대부분의 경우 작동합니다.

그러나 분기가 아래와 같이 부분적으로 일치하면 작동하지 않습니다.

$ git branch -a
creative/dev
qa/dev

$ git ls-remote --heads origin dev | wc -l
2

사용하다

git ls-remote --heads origin <branch> | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^<branch>$ | wc -l

신뢰할 수있는 방법을 원한다면.

스크립트에서 사용 origin하고 기본 원격 으로 가정하지 않으려면

git ls-remote --heads $(git remote | head -1) "$branch" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^"$branch"$ | wc -l

작동해야합니다.

참고 git branch -a | grep ...마지막 이후 잠시 될 수 있으므로 신뢰할 수 없습니다 fetch실행되었습니다.


나에게 이것은 Amitesh (짧은 원격 이름)의 대답과 결합 된 James Cache의 대답과 결합 된 ( grep -x "$branch")과 동일합니다 grep ^"$branch"$. 스크립트에서는 긴 형식의 스위치를 선호하지만 --line-regexp. 또한 할 필요가 없습니다 wc -l. Bash에 빈 출력을 넣는 것은 if [ -z ] 사실상 참으로 평가되므로 분기가 존재하지 않음을 의미합니다. 그러면 몇 밀리 초가 절약됩니다.
Amedee Van Gasse

1

원격으로 사용하는 저장소를 추가 git remote add something https://github.com/project-name/project-name.git한 다음 a git remote show something를 수행 하여 원격에 대한 모든 정보를 얻을 수 있습니다. 이를 위해서는 네트워크 연결이 필요하며 사람이 사용하는 데 유용합니다.

또는 git fetch something. 이렇게하면 호출 된 원격의 모든 분기를 가져와 something로컬 저장소에 보관합니다. 그런 다음 원하는대로 로컬 브랜치에 병합 할 수 있습니다. 마지막 으로 병합 해야 한다고 결정한 경우 수행해야하는 작업이므로이 경로를 권장합니다 .

OT : "로컬 체크 아웃"을 사용한다는 것은 중앙 집중식 버전 제어 시스템 관점에서 접근하고 있음을 나타냅니다. 그것은 일반적으로 git을 다룰 때 막 다른 골목입니다. 이전 시스템과는 다르게 "체크 아웃"등과 같은 단어를 사용합니다.


설명해 주셔서 감사합니다. 나는 아직 git에 익숙해지지 않았고 다른 사고 방식이 필요합니다.
Keen

1

당신은 시도 할 수 있습니다

git diff --quiet @{u} @{0}

여기 @{u}에서는 원격 / 업스트림을 @{0}나타내며 현재 로컬 HEAD를 나타냅니다 (최신 버전의 git에서는 다음 @{0}과 같이 줄일 수 있습니다.@ ). 원격이 없으면 오류가 발생합니다.

git 2.16.2 (예를 들어, git 1.7.1에는이 기능이없는 첫 번째 버전이 무엇인지 모르겠 음)를 사용하면 다음과 같이 할 수 있습니다.

git checkout

원격 분기가 존재하면 다음과 같은 출력이 있습니다.

Your branch is up to date with 'origin/master'

그렇지 않으면 출력이 없습니다.


1

이름에 쿼리를 포함하는 모든 분기 (원격 또는 로컬)를 반환합니다.

git branch --all | grep <query>


0

브랜치 이름이 매우 구체적인 경우 간단한 브랜치 이름 일치에 grep을 사용할 필요가 없습니다.

git ls-remote --heads $(git remote | head -1) "*${BRANCH_NAME}*" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    wc -l

작동하는

BRANCH=master
BRANCH=mas
BRANCH=NonExistingBranch (returns 0)
BRANCH=ISSUE-123

고유 한 이슈 ID를 지점 이름으로 사용하며 제대로 작동합니다.


0

나는 이것을 시도했다.

git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l

"your-branch"분기가 발견되면 1을 반환하고 그렇지 않으면 0을 반환합니다.


0

위의 답변 중 일부를 스크립트로 결합하고 있습니다.

BRANCHES=(develop master 7.0 7.0-master)
ORIGIN=bitbucket
REMOTE=github

for BRANCH in "${BRANCHES[@]}"; do
  BRANCH=$(git ls-remote --heads "${ORIGIN}" "${BRANCH}" \
      | cut --delimiter=$'\t' --fields=2 \
      | sed 's,refs/heads/,,' \
      | grep --line-regexp "${BRANCH}")
  if [ -n "${BRANCH}" ]
  then
    git branch --force "${BRANCH}" "${ORIGIN}"/"${BRANCH}"
    git checkout "${BRANCH}"
    git push "${REMOTE}" "${BRANCH}"
  fi
done

git push github --tags

이 스크립트는 원격 bitbucket에서 4 개의 브랜치를 가져 와서 원격 github로 푸시 한 다음 모든 태그를 github로 푸시합니다. 나는 이제 당신이 어떤 표시되지 않는 이유하는 젠킨스 작업이 사용하고 git fetch또는git pull 이미 젠킨스 작업 저장소 설정에서 수행된다.

나는 보통 스크립트에서 긴 형식의 옵션을 선호합니다. 나는 결합했다 수 git branchgit checkout사용하여 git checkout -B.

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