2010-08-17 5 views
4

원격 커밋 저장소 (origin)에 특정 커밋이 포함되어 있는지 여부를 결정하고 싶습니다. 사용 사례는 다음과 같습니다.Git 저장소가 특정 커밋을 포함하는지 확인

공개 석방을 준비 중입니다. 릴리스를 빌드 할 원시 코드베이스를 나타내는 커밋의 SHA-1을 포함하고 싶습니다.

또한 커밋이 로컬 커밋이 아니라 중앙 저장소 (원본)로 푸시되었음을 보장하고자합니다.

나는

 

git pull --all & git branch --contains commit-hash 
 

을 생각하고는, 현재 브랜치의 추적 브랜치를 포함 작동하지만, 오히려 성가신 보인다 있는지 확인하기 위해 출력을 검사. 나는 git remote --contains origin commit-hash 또는 git cat-file origin commit-hash과 같은 좀 더 간결한 것을 찾고 있습니다. 힘내 기가 밀거나 당기는 동안 어떤 물체가 옮길 필요가 있는지를 결정할 때 힘내 기 (git)가 사용하는 위생 명령이 있어야한다고 생각합니다. - 나는 내부 구조에 익숙하지 않습니다.

도움 주셔서 감사합니다. git fetch && git branch -r --contains <commit-id>

답변

5

. 처음 가져 오기, 그리고 그들은 지점 수 있기 때문에, commitA에 대한 SHA1을 얻을 수 레브 - 구문 분석을 사용

if [ "$(git rev-parse $commitA)" == "$(git merge-base $commitA $commitB)" ]; then ...; else ...; fi 

랩이를 별칭에 당신은 설정해야합니다.

푸시 및 가져 오기 (당기기) 중에는 C로 구현되어 노출 된 위생 명령을 직접 호출하지 않습니다.

+1

hmmm ... 나는 -r 옵션을 간과했다. 이것은 효과가있을 것이지만 나는 아직도 내가 빠뜨린 배관 명령이 있어야한다고 생각한다. 그리고 실제로, 현재 브랜치의 추적 브랜치에 커밋이 포함되어 있는지 여부는 신경 쓰지 않습니다. 나는 그 커밋이 어떤 브랜치에 접근 할 수 있는지에 관계없이 커밋이 원천에 존재한다는 것에 신경을 썼다. – Josh

+0

@ Josh : 분명히 공개 릴리스 인 경우 해당 분기가 무엇인지 신경 써야합니다. 특정 분기에 대해서는 분기에 있어야합니다. – Cascabel

+0

스크립트의 경우와 같이 위생 설비를 사용하는 것이 좋습니다.'git merge-base --is-ancestor ' – JaviMerino

5

나도 일부 배관을 간과 할 수 있지만 commitA는 commitB의 조상이 git merge-base commitA commitBcommitA 있는지 확인하는 것입니다 경우 지금까지의 내가 말할 수있는 가장 직접적인 방법은 테스트 :에 대해 어떻게

0

git fetch + git branch -r 당신이 얻을 수있는 최선입니다.

이 결과를 얻기 위해 git protocol을 해킹 할 수 있지만 afaik를 사용할 수있는 배관은 없습니다. 자세한 내용은 섹션 5를 참조하십시오. 그냥 "해킹"명령을 확인하고 서버가 NAK인지 확인하십시오.

더 쉬운 해킹은 서버가 원할 경우 해당 커밋을 푸시합니다.

0

검토 중이지만 아직 병합되지 않은 gerrit 브랜치에서 볼 수 있습니까? fetch 후 자식 --all --contains 모든 지점을 나열하지만, ​​리뷰 페이지에 커밋이 표시되지 않습니다.

관련 문제