답변:
$ 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
/refs/heads/branch-name. 그렇지 않으면가 foo/branch-name없는 경우에도 분기 가 반환됩니다 branch-name.
git ls-remote --heads origin branch-name
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
git ls-remote --exit-code . origin/branch-name &> /dev/null로 사용 $?되었습니다
if git ls-remote ...; then ...; fi검사 $?(기록 문, 트랩 등으로 변경할 수 있음) 보다 오류가 덜 발생 합니다.
--heads?
--heads는 브랜치 만 나열합니다. --tags태그 만 나열 하는 데 사용 합니다.
실행할 git repo 인 경우 현재 폴더에서 사용할 수있는 또 다른 방법
git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch사용하는 경우 git branch -a모든 원격 참조를 먼저 가져옵니다. 그렇지 않으면 git ls-remote다른 사람이 지적한대로 사용 합니다.
git branch -a --list '<pattern>'또한 옵션입니다. 스크립트에 대한 리턴 코드가 필요한 경우 grep에 파이프하십시오.
다음을 사용할 수도 있습니다.
git show-branch remotes/origin/<<remote-branch-name>>
$?의 최신 커밋과 값을 반환합니다. 값이 0이면 "심각 : 불량 sha1 참조 원격 / 원점 / <>"및 $? 128입니다
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
도움이되기를 바랍니다.
그러면 매번 수동으로 저장소 이름을 전달할 필요가 없습니다.
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을 입력하면 리모컨에 대한 자세한 정보를 볼 수 있습니다.
여기에있는 모든 답변은 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.
$ 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실행되었습니다.
grep -x "$branch")과 동일합니다 grep ^"$branch"$. 스크립트에서는 긴 형식의 스위치를 선호하지만 --line-regexp. 또한 할 필요가 없습니다 wc -l. Bash에 빈 출력을 넣는 것은 if [ -z ] 사실상 참으로 평가되므로 분기가 존재하지 않음을 의미합니다. 그러면 몇 밀리 초가 절약됩니다.
원격으로 사용하는 저장소를 추가 git remote add something https://github.com/project-name/project-name.git한 다음 a git remote show something를 수행 하여 원격에 대한 모든 정보를 얻을 수 있습니다. 이를 위해서는 네트워크 연결이 필요하며 사람이 사용하는 데 유용합니다.
또는 git fetch something. 이렇게하면 호출 된 원격의 모든 분기를 가져와 something로컬 저장소에 보관합니다. 그런 다음 원하는대로 로컬 브랜치에 병합 할 수 있습니다. 마지막 으로 병합 해야 한다고 결정한 경우 수행해야하는 작업이므로이 경로를 권장합니다 .
OT : "로컬 체크 아웃"을 사용한다는 것은 중앙 집중식 버전 제어 시스템 관점에서 접근하고 있음을 나타냅니다. 그것은 일반적으로 git을 다룰 때 막 다른 골목입니다. 이전 시스템과는 다르게 "체크 아웃"등과 같은 단어를 사용합니다.
당신은 시도 할 수 있습니다
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'
그렇지 않으면 출력이 없습니다.
이름에 쿼리를 포함하는 모든 분기 (원격 또는 로컬)를 반환합니다.
git branch --all | grep <query>
브랜치 이름이 매우 구체적인 경우 간단한 브랜치 이름 일치에 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를 지점 이름으로 사용하며 제대로 작동합니다.
위의 답변 중 일부를 스크립트로 결합하고 있습니다.
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 branch및 git checkout사용하여 git checkout -B.
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null다음if [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi