2012-02-10 2 views
10

상황 : github 프로젝트에서 tar.gz를 릴리스했지만이 중 어떤 것을 수행했는지 확인하고 싶습니다. 그것은 태그가 붙은 것으로 보이지 않거나 커밋 메시지 자체에서 명백합니다.처음으로 git 파일에서 커밋을 찾을 때

그래서 파일의 sha1을 계산할 수 있지만 어떤 것이 속해 있는지 확인하고 싶습니다.

git 위저드 불러 오기!

+2

왜 downvotes? 이것은 흥미로운 문제입니다. 그는 Git 저장소에서 생성되었지만 현재 버전 관리하에 있지 않은 파일이 있으며, 해당 버전과 일치하는지 알고 싶어합니다. 공정한 질문입니다. – eykanal

+0

Upvoted. Git이 역사를 저장하는 훌륭한 방법을 보여주는 훌륭한 질문입니다. –

+0

두 가지 훌륭한 답변에 감사드립니다. 나는 tar.gz가 repo의 정확한 export라는 질문을 던질 때 가정했었다. 그러나 두 가지 방법을 모두 시도 했으므로 커밋은 매우 가깝다. 차이점은 수동으로 나타난 README 파일에있다. 릴리스 용으로 편집되었습니다. 그래서 diff 기반 답변에 대한 크레딧을 주겠지 만, 다른 대답을 말하지 않는 것이 훌륭한 대답도 아니 었습니다. 다시 한번 감사드립니다. – bee

답변

2

git에 저장된 해시에는 파일 콘텐츠가 포함되어 있지 않으므로 (이론적으로는 해시 충돌이 발생 함) 실제 필요한 버전의 파일을 확보했는지 확인해야합니다. 내용을 비교하십시오.

for rev in $(git log --format=%H -- /path/to/file); do 
    git diff --quiet $x:/path/to/file my-current-file; 
    if [[ $? -eq 0 ]]; then 
     echo $x; 
    fi 
done 

영어 : 파일을 변경 한 버전을 역순으로 반복합니다. 그러한 각 리비전마다 트리 외부 파일과 함께 파일의 버전을 비교하십시오. 두 파일이 동일하면 개정 해시를 인쇄하십시오. 당신이 전체 타르볼이 작업을 수행하려면

, 당신은 같은 대신 단일 파일의 전체 트리를은 diff 할 (그리고 git log에 인수로 파일 경로를 생략 할) 수 - 사용 무엇이든 허용은 diff 옵션 너는 좋아한다.

+0

타르가 어디서 왔는지 알아 보려면 타르의 모든 파일을 일치시켜야합니다. –

+0

@AdamDymitruk 이에 대한 답변 끝에 메모를 추가했습니다. – Borealid

+0

이 경우 검색하는 데 시간이 오래 걸릴 수 있습니다. 그러나 파일 속성을 모호하게 제거해야합니다. –

2

이 메서드는 파일 특성 때문에 까다로울 수 있습니다. 그것들이 변하지 않거나 repo가 ​​저장하는 것을 보았다면 그것들이 동일하다는 것을 확인하십시오. 이것을 저장소에 맡긴 다음 트리의 해시를 살펴보십시오.

git show -s --pretty=format:%T HEAD 

이제 모든 커밋을 리포에서 걷고 같은 해시 트리가 있는지 확인하십시오.

git log --all --format=%H 

은 모든 커밋 해시를 제공합니다. 타르 정확히 권한을 포함하여 동일한 구조가 포함 된 경우 이제 관이 트리 해시에게

git log --all --format=%H \ 
    | xargs -n 1 git show -s --pretty='format:%H %T' \ 
    | gerp <hash of your tree> 

을 표시, 출력은 같은 나무가 커밋의 SHA1s 표시됩니다.

최상위 수준의 트리 SHA1을 검색하면 FAST가됩니다.

관련 문제