git에서 바이너리 파일을 어떻게 diff 할 수 있습니까?


28

git에서 바이너리 파일을 diff하기 위해 difftool을 설정해야한다고 가정합니다.

어떤 difftools가 작동합니까? 파라미터를 어떻게 넣습니까?


이진 파일의 diff 도구에서 어떤 종류의 출력을 얻을 수 있습니까? 어떤 종류의 이진 파일입니까? 텍스트 형식으로 렌더링 한 다음 비교할 수있는 것입니까?
Zoredache

답변:


22

textconv파일 유형에 대한 구성 옵션을 설정할 수 있습니다 . gitattributes (5)의 "이진 파일의 텍스트 차이 수행"을 참조하십시오 . 사용해야 할 것은 파일 유형에 따라 다릅니다.

예 1 :

zip 파일의 내용을 비교하고 싶다고 가정 해보십시오. 이 경우 $ GIT_DIR / config 파일 또는 $ HOME / .gitconfig에 다음을 입력해야합니다.

[diff "zip"]
    textconv = unzip -v

다음에 저장소의 zip 파일에서 diff를 요청 unzip -v하면 버전이 모두 호출 되고 결과 텍스트가 달라집니다.

예 2 :

pdf 파일의 경우 예를 들어 pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

예 3 :

파일 유형에 대한 특정 정보 유틸리티가없는 경우 다음을 사용할 수 있습니다 hexdump(Linux에서도 사용 가능한 FreeBSD 및 OSX와 함께 제공).

[diff "bin"]
    textconv = hexdump -v -C

나는 그것을 16 진수로 나눌 수 있습니다. 몇 바이트가 다른지 또는 바이트가 다른 위치를 아는 것만으로도 행복 할 것입니다. git 저장소를 복제하여 Hex Fiend를 사용하여 git가 프로그램을 시작하는 방법을 알 수 없었기 때문에 두 버전의 파일을 모두 확인할 수있었습니다.
Nick Retallack

@NickRetallack : 추가 된 예를 참조하십시오.
Roland Smith

2
내 자식 설정에 예 3을 추가,하지만 난 "자식은 diff"할 때는 여전히 나에게 같은 짧은 메시지 제공 : "/ 파일 다른 이진은 / 파일와 B 파일을"
닉 레 탈락

1
libmagic을 사용하고 싶다면 git 소스 코드를 살펴보아야합니다.
Roland Smith

5
내 .gitattributes에 * .bin diff = bin을 추가 한 후 마침내이 기능이 작동했습니다
Justin Rowe

11

롤랜드 스미스의 답변은 도움이되었지만 현재는 불완전합니다 (주석 참조). 여기에는 두 부분이 있습니다.

리포지토리 .git/config파일 또는 개인 전역 ~/.gitconfig파일에 새 diff 명령을 정의 할 수 있습니다 ( 예 hexdump: 다음을 사용하는 hex diff 명령) .

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

다음으로 저장소의 .gitattributes파일 을 사용하여 git에게이 특별한 diff 명령에 어떤 파일을 사용해야하는지 알려야합니다.

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

.gitignore파일 과 마찬가지로 파일을 .gitattributes리포지토리에 체크인해야합니다.

내 경우에는 바이너리로 취급하려는 여러 가지 파일 확장자가 있습니다 (예 : Windows에서 git을 사용하는 경우 줄 끝 변환을 피하십시오) hexdump.

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

이미지 파일과 함께 사용할 hexdump diff 명령을 정의하는 다른 예 는 https://github.com/resin-io/etcher/pull/1367참조 하십시오 .


.gitattributes전역을 설정할 수도 있습니다 ( [diff]global 항목 과 함께 .gitconfig). .gitattributes로컬을 리포지토리로 만들면 .gitconfig보안상의 이유로 원격지로 푸시되지 않기 때문에 사용자는 로컬 리포지토리 설정 을 수정 해야합니다. 어느 쪽이든, 각 사용자는이 동작을 가능하게하기 위해 어떻게 든 로컬 파일 / 구성을 업데이트해야합니다. 에서 .gitconfig아래 [core]추가 attributesfile = c:/users/<username>/.gitattributes하여 어디든지 당신이 그것을 글로벌 (심지어 창에서 forwardslashes주의) 할 경우를 저장할.
LightCC

10

git이 바이너리 파일 diff를 일반 텍스트 diff로 표시하도록하려면 다음 --text과 같이 옵션을 사용하십시오 .

git diff --text

-1

위의 방법은 포괄적 인 방법입니다. 그러나 몇 개의 파일에 대해 필요한 경우 다음 방법을 사용합니다.

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

여기서는 사용하고 vimdiff있지만 다른 도구를 사용할 수 있습니다. 이 작업을 반복해서 반복해야하는 경우 위의 내용을 작은 스크립트로 결합 할 수도 있습니다.


이것은 내 파일의 변경 사항을 버린 것으로 보입니다 (그리고 커밋 된 버전이되기를 원하는 빈 파일을 만들었습니다).
Erhannis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.