2013-10-16 5 views
3

나는 임의의 파일 foo을 가지고 있는데, 자식에게 커밋되지 않았습니다.파일이 git의 기록에서와 동일한 지 확인하는 방법

전체 기록이 자식 (bar)으로 유지 된 파일도 있습니다.

foo이 존재하는 bar의 모든 버전과 동일한 지 어떻게 확인할 수 있습니까? md5sum, git loggrep의 조합을 사용

답변

2

foo 파일의 md5sum grep을 foo가 덩어리로 REPO에 표시해서,

file=foo # or argument to script, etc 
sha1=$(git hash-object -t blob $file) 
repotype=$(git cat-file -t $sha1 2>/dev/null) || { 
    echo "file \"$file\" is not in the repo" 
    exit 1 
} 
[ $repotype = blob ] || { 
    echo "uh oh: file \"$file\" matches non-file ($repotype) object" 
    exit 1 
} 

를 단을, bar이라는 이름으로 나타나지는 않습니다 (또는 전혀 아닐 수도 있습니다. git add에 있었지만 아직 커밋되지 않았을 수 있습니다). 그래서 지금 모든보고가 아니라 거기 경우 커밋 건너 뛰는, 대상 경로를 블롭-ID를 추출, 커밋 (합리적인?) : 당신이 에서 어떤 이름을 찾으려면 오히려

target_path=bar 

git rev-list --branches |  # or --all, or HEAD, or (etc) 
while read id; do 
    file_id=$(git rev-parse -q --verify $id:$target_path) || continue 
    [ $file_id = $sha1 ] || continue 
    echo "found \"$file\" as \"$target_path\" in $id" 
    # do more here if you like, e.g., git show $id 
done 

일부 특정 명시 적 이름보다 git ls-tree -r을 각각 모두 blob을 찾고 ID를 확인할 수 있습니다.

:

+0

아름다운 (주 단편을 제외하고 검증되지 않은, 그리고 가끔 비트가 오타 또는 바보 오류 조심, 다시 입력하거나 길을 따라 변경되었을 수 있습니다), 오른쪽 상자 밖으로했다. – Patrick

0

일 것입니다 : 모든 bar 파일을 커밋의

for SHA in `git log --pretty=format:"%h" bar`; do 
    git show $SHA:bar | md5sum 
done | grep `md5sum foo| cut -d' ' -f1` 

위의 명령 git log --pretty=format:"%h" bar이 목록을 우리가 보여 그들의 각 하나 (git show에 md5sum이 작업을 수행 그 커밋의 파일). 끝에서 우리가 파일 foo의 내용이 어딘가에 REPO에 나타나면에게 쉽게

관련 문제