2009-07-21 5 views
42

외부에서 git 저장소의 최신 SHA를 얻는 방법을 아는 사람이 있습니까? 나는 자식 저장소 안에 아니다, 그러나원격 자식 저장소에서 최신 커밋의 SHA를 얻는 방법?

git log origin/branch_X | head -1 

을, 난 그냥 최신 SHA를 얻을 수 clone에 저장소를 피하기 위해 싶습니다 : 당신이 자식 저장소 안에있는 경우

을 수행 할 수 있습니다 태그/분기의. 이 일을하는 영리한 방법이 있습니까?

+0

쿼리 할 리포지토리에 대한 파일 시스템 액세스 권한이 있습니까? –

+3

올바른 방법은 git-log –

답변

50

your answer는 올바른 : 그러나

$ git ls-remote <URL> 

같은 파일 시스템 간단한 해결책 (에서 SHA-1을 추출 할 필요가없는에있는 경우 출력은) 단순히 다음과 같습니다

$ git --git-dir=/path/to/repo/.git rev-parse origin/branch_X 

가 '--git-dir'옵션의 설명 git(1) 맨 페이지를 참조하십시오. 방금 SHA-1 지역의 repo의 현재 체크 아웃 지점에서, 당신은 단지 대신 기원의 머리를 지정할 수 있습니다 원하는 경우

15

는 내 동료는 나를 위해이 대답 지사 머리에

git ls-remote ssh://git.dev.pages/opt/git/repos/dev.git <branch> 

스티브

+1

이 아닌 "git rev-parse origin/branch_X"또는 "git rev-parse refs/remotes/origin/branch_X"입니다. 이 질문에 대한 답변으로 업그레이드해야합니다. – Abhijeet

3

참조는 .git/refs/ 트리에 저장됩니다. 따라서 최신 커밋의 해시를 찾을 수 있어야합니다.

cat .git/refs/remotes/origin/branch_X 

경로가 약간 다를 수 있습니다. 원격 저장소에 주어진 지점의 SHA-1을 확인하려면

+1

당신이 심판을 포장 한 경우 그건 작동하지 않을 것입니다. 그런 다음 .git/packed-refs를 살펴 봐야합니다. –

+0

사실,이 솔루션은 향후 Git on-disk 리포지토리 형식이 변경 될 수 있습니다. –

3

/branch_X :

git --git-dir=/path/to/repo/.git rev-parse --verify HEAD

14

이 트릭을 할해야 git ls-remote REMOTE | awk "/BRANCH/ {print \$1}"

REMOTE를 원격 저장소의 이름으로 바꾸고 BRANCH를 분기 이름으로 바꾸십시오.이 최고의해야 위의 설명에서 언급 한 바와 같이

$ git --git-dir=/path/to/repo/.git rev-parse origin/<targeted-banch> 
74

사용 rev-parse

git rev-parse origin/master # to get the latest commit on the remote 

git rev-parse HEAD   # to get the latest commit on the local 
+1

+1 추가와 함께 가장 유용함이 입증되었습니다. | clip을 사용하여 sha를 클립 보드 (윈도우)에 놓습니다. –

+0

그리고 그 맥 사용자들에게는'git rev-parse origin/master | pbcopy'는 클립 보드에 커밋 sha ('\ n')를 넣어서 편리하게 붙여 넣을 것입니다. – Aaron

+1

'git rev-parse HEAD'는 로컬 복사본의 최신 커밋을 반환하고, 'git rev-parse origin/master'는 원격 커밋을 반환합니다. 첫 번째 명령을 제거해야하는 경우에도 이것이 가장 좋아하는 대답입니다. 감사합니다 @fedelibre. – fedelibre

14

솔루션 :

$ git ls-remote <URL> | head -1 | cut -f 1

+1

'sed "s/\ tHEAD //"'를 사용하여 뒤 따르는 탭을 제거하십시오. – Perseids

+1

'| awk '{print $ 1}''? – devxoul

+1

또는'cut -f 1'? – kisp

8

:

$ git ls-remote <URL> | head -1 | sed "s/HEAD//" 

접근 시스템의 디렉토리를 사용 : 자식 URL을 사용하여

+1

이것은 분기 된 저장소의 업스트림 리모트에서 커밋을 얻는 데 도움이되는 유일한 옵션입니다. – Jalakoo

1

는 난 단지 특정 지점에 관련된 가져 오는 정보를 추천하고 최신 샤를 얻기 위해 분석 : git ls-remote <url> --tags <branch_name> | awk '{print $1;}'

2


을 Heres 저장소 내에서 작동하는 복사 - 붙여 넣기 솔루션입니다.

origin_head=$(git ls-remote --heads $(git config --get remote.origin.url) | grep "refs/heads/master" | cut -f 1) 
if [ $origin_head != "$(git rev-parse HEAD)" ]; then 
    echo >&2 "HEAD and origin/master differ." 
    exit 1 
fi 
+1

'grep "refs/heads/master $"'를 사용하면 누군가가 마스터가 아닌 다른 브랜치를 요구할 수도 있고 master2 브랜치를 사용하는 것이 중단 될 수도 있습니다. – kitingChris

관련 문제