git은 바이너리 파일에 적합합니까?


97

git은 바이너리 파일에 적합합니까?

압축되지 않은 많은 파일이 수정되고 많은 압축 파일이 수정되지 않았거나 거의 수정되지 않은 경우 git이 잘 처리할까요? 예를 들어 중간을 삽입하거나 제거하고 끝 부분에 데이터를 삽입하면 텍스트와 마찬가지로 인식됩니까?

git이 바이너리 파일에 적합하지 않은 경우 어떤 도구를 고려할 수 있습니까?


1
바이너리와 매우 잘
어울립니다

사실입니다. / home을 git 개정 아래에 놓을 수 있으며 꽤 잘 작동합니다.
Loïc Faure-Lacroix 2011 년

1
이것은 이진 파일에 대해 diff가 수행되었는지 여부에 대한 우려로 명확하게 언급 된 질문의 정신이 아닙니다 (아마 저장소 팽창 및 성능상의 이유로). 그러나 나는 그것을 반대 투표하지 않았습니다 (그리고 누구든지 그것을 제거한 것처럼 보입니다).
coreyward 2011 년

1
참고 : 이제 바이너리를 다른 곳에 저장할 수있는 git-lts가 있습니다. stackoverflow.com/a/29530784/6309
VonC 2015

1
.git 폴더가 팽창합니까?
Nikhil

답변:


47

기본적으로 git은 바이너리 파일을 색인에 쉽게 추가 할 수 있으며 압축 할 수없는 대용량 파일을 자주 업데이트하지 않는 한 효율적인 방법으로 저장할 수 있습니다.

문제는 git이 diff 및 병합을 생성해야 할 때 시작됩니다. git은 의미있는 diff를 생성하거나 이진 파일을 합리적 일 수있는 방식으로 병합 할 수 없습니다. 따라서 바이너리 파일 변경과 관련된 모든 병합, 리베이스 또는 체리 픽에는 해당 바이너리 파일에 대한 수동 충돌 해결 작업이 포함됩니다.

이진 파일 변경이 병합, 리베이스, 체리 픽과 관련된 일반적인 git 워크 플로에서 발생하는 추가 수동 작업을 수행 할 수있을만큼 드물지 여부를 결정해야합니다.


26
바이너리 파일 변경은 문제가되지 않는다는 점을 지적해야합니다. 여러 곳에서 변경 한 다음 병합을 시도하는 것은 문제가되지 않습니다.
Winston Ewert 2011 년

15
git은 의미있는 diff를 생성 할 수 있습니다. 로 생성 된 diff git diff --binary는 바이너리 파일을 패치 할 수 있습니다.
CB Bailey

46

다른 답변 외에도.

  • 소위 이진 diff 형식을 사용하여 이진 파일에 diff를 보낼 수 있습니다 . 사람이 읽을 수 없으며 저장소에 정확한 사전 이미지가있는 경우에만 적용 할 수 있습니다 .
    예 :

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • textconv gitattribute 를 사용 git diff하여 이진 파일 또는 이진 파일의 일부에 대해 사람이 읽을 수있는 차이를 표시 할 수 있습니다 . 예를 들어 * .jpg 파일의 경우 EXIF ​​정보가 다를 수 있으며 PDF 파일의 경우 텍스트 표현 (pdf2text 또는 이와 유사한 것)간에 차이가있을 수 있습니다.

HTH.


5
gitattributes에 대해 가르쳐 주셔서 대단히 감사합니다! 완전히 새로운 가능성의 세계를 엽니 다.
hermannloose

15

정말 큰 바이너리 파일이있는 경우 git-annex를 사용하여 저장소 외부에 데이터를 저장할 수 있습니다. 확인 : http://git-annex.branchable.com/


6
Git-annex는 매우 훌륭하지만 , 음악 파일, 그림, PDF 등 자주 변경되지 않는 파일에 더 적합합니다 .
sr_

@sr_ 정확히 Git LFS도 마찬가지입니다. 이러한 유형의 사용 사례에 적합한 버전 제어 시스템은 없지만 분산 시스템 (예 : Git)을 기반으로하는 것 같습니다.
Marc J. Schmidt

5

버전 제어를 위해 바이너리 파일의 차이점을 저장하려는 도구는 없지만 Git이 텍스트 파일에 대해서도이 작업을 수행하지 않는다는 점은 주목할 가치가 있습니다. Git은 파일을 blob으로 저장하고 필요할 때 파일간에 차이점을 수행합니다.

Photoshop / Illustrator 문서와 같은 문서에서 버전 제어를 수행하려는 경우 GridIron Flow 가 트릭을 수행 할 수 있습니다. 컴퓨터간에 동기화를 유지하려는 경우 Dropbox 또는 Rsync가 처리 할 수 ​​있지만 지능형 비교를 수행하지는 않습니다.


1
git 커뮤니티 책 ( book.git-scm.com/7_how_git_stores_objects.html )에서 : "Git은 공간을 절약하기 위해 packfile을 사용합니다. 이것은 Git이 두 번째 파일에서 변경된 부분 만 저장하는 형식입니다. , 비슷한 파일에 대한 포인터가 있습니다. "
Wayne Conrad

2
예, git gc가비지 수집 을 실행 하는 경우 입니다. 같은 페이지에서 : "Git은 각 파일의 각 버전을 별도의 객체로 저장하므로 매우 비효율적 일 수 있습니다. 파일 길이가 수천 줄이고 한 줄을 변경한다고 상상해보십시오. Git은 두 번째 파일을 전체적으로 저장합니다. 엄청난 공간 낭비입니다. "
coreyward 2011 년

2
공정한 '너프. git은 적어도 내가 사용하는 프로젝트에서는 gc를 자동으로 수행합니다. 실행시기를 결정하는 데 사용하는 메트릭이 무엇인지 모르겠습니다. 아마도 gc를 트리거하지 않는 (또는 드물게) 트리가있을 수 있습니다.
Wayne Conrad

1
의 man 페이지에서 git gc"사용자는 각 저장소 내에서이 작업을 정기적으로 실행하여 좋은 디스크 공간 활용도와 우수한 운영 성능을 유지하는 것이 좋습니다. 일부 git 명령은 자동으로 git gc를 실행할 수 있습니다. 자세한 내용은 아래 --auto 플래그를 참조하십시오. . "
Jacob Akkerboom

1
@KennyEvitt 지금 톤이 있습니다. Abstract 는 하나이고 Kactus 는 뒤에서 git을 사용하는 또 다른 하나입니다.
coreyward

3

git은 바이너리에 좋습니다. 그러나 텍스트 파일과 같은 바이너리는 처리하지 않습니다. 바이너리 파일을 병합하려는 것과 같습니다. 내 말은, jpeg의 diff는 당신에게 아무것도 반환하지 않을 것입니다. Git은 텍스트 파일과 매우 잘 작동하며 바이너리 파일을 사용하는 다른 모든 솔루션만큼 나쁠 것입니다!


2

버전 관리를위한 솔루션을 원한다면 파일에 대한 경량 포인터가있는 git-lfs 를 고려할 수 있습니다.

이는 저장소를 복제 할 때 모든 버전을 다운로드하지 않고 체크 아웃 된 버전 만 다운로드 함을 의미합니다.

사용 방법에 대한 멋진 자습서 가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.