2011-01-15 3 views
64

이진 파일에는 git이 좋습니까?이진 파일에는 git이 좋습니까?

많은 압축되지 않은 파일이 수정되고 많은 압축 파일이 수정되지 않으면 잘 처리 할 수 ​​있습니까? 예를 들어 중간에 삽입 또는 제거하고 끝에 데이터를 삽입하면 텍스트와 마찬가지로 데이터가 인식됩니다.

이진 파일에 git이 적합하지 않은 경우 어떤 도구를 고려해 볼 수 있습니까?

+0

바이너리로 매우 좋음 - 직접 사용합니다. – tekknolagi

+0

사실입니다./home을 git 리비전에 넣으면 꽤 잘 돌아 간다. –

+0

이것은 바이너리 파일이 diff 작업을 수행했는지 (아마도 저장소가 팽창하고 성능상의 이유로) 걱정되는 것으로 분명히 지적되는 질문의 정신이 아닙니다. 그러나, 나는 그것을 downvote하지 않았다. (그리고 그것을 제거한 이후로 누구든지 나타난다.) – coreyward

답변

2

음, 이진은 바이너리와 잘 맞습니다. 그러나 텍스트 파일과 같은 바이너리는 처리하지 못합니다. 바이너리 파일을 병합하려는 것과 같습니다. 내 말은, jpeg의 차이점은 결코 당신에게 어떤 것도 돌려주지 않을 것입니다. 힘내는 텍스트 파일로 잘 작동하며, 바이너리 파일이있는 다른 모든 솔루션만큼 좋지 않을 수 있습니다!

4

버전 관리를 위해 바이너리 파일의 diff 파일을 저장하려고하는 도구에 대해서는 알지 못합니다.하지만 힘내라도 텍스트 파일에도이 작업을 수행하지 않습니다. 힘내는 파일을 얼룩 (blob)으로 저장한다. 필요할 때 파일을 서로 비교한다.

Photoshop/Illustrator 문서에서 버전 제어를하려는 경우 GridIron Flow이 당신을 대신 할 수 있습니다. 컴퓨터간에 동기화를 유지하려고한다면 Dropbox 또는 Rsync에서 처리 할 수 ​​있지만 지능형 차이를 만들지는 않습니다.

+1

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

+2

가비지 콜렉션을 수행하기 위해'git gc'를 실행하면/그래. 같은 페이지에서 : "Git은 각 파일의 각 버전을 별도의 객체로 저장하기 때문에 꽤 비효율적 일 수 있습니다. 파일이 수천 줄 길며 한 줄을 변경한다고 가정하면 Git은 두 번째 파일을 완전히 저장합니다. 공간의 큰 낭비입니다. " – coreyward

+2

Fair 'nuff. git은 자동적으로 gc를 수행하고, 최소한 프로젝트를 위해 사용한다. 나는 언제 실행할 것인지를 결정하기 위해 어떤 메트릭스를 사용하는지 모르겠다. 아마도 결코 (또는 드물게) GC를 트리거하지 않는 트리가있을 것이다. –

28

git은 쉽게 압축 할 수없는 큰 파일을 업데이트하지 않는 한 이진 파일을 색인에 쉽게 추가 할 수 있으며 효율적인 방법으로 저장할 수 있습니다.

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

바이너리 파일 변경 사항이 병합, 리베이스, cherrypicks가 포함 된 일반적인 git 워크 플로에서 발생하는 추가 수동 작업으로 생존 할 수 있는지 여부를 결정해야합니다.

+14

바이너리 파일의 변경 사항은 여러 위치에서 변경 한 다음 병합하려고하면 문제가되지 않는다는 점을 지적해야합니다. –

+10

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

34

기타 답변 외에도.

  • 당신은 소위 이진은 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)[email protected]{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`[email protected] 
    [email protected]=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX 
    
  • 당신은 TEXTCONVgitattribute 사용할 수있는 바이너리 파일 또는 바이너리 파일의 부품에 대한 git diff 쇼 사람이 읽을 수 DIFF을합니다. 예를 들어 * .jpg 파일의 경우 EXIF ​​정보가 다를 수 있습니다. PDF 파일의 경우 텍스트 표현 (pdf2text 또는 이와 유사한 것)이 다를 수 있습니다.

HTH.

+3

gitattributes에 대해 가르쳐 주셔서 대단히 감사합니다! 완전히 새로운 가능성을 열어줍니다. – hermannloose

11

정말 큰 바이너리 파일이 있다면 git-annex를 사용하여 저장소 외부에 데이터를 저장할 수 있습니다. 체크 아웃 : http://git-annex.branchable.com/

+2

Git-annex는 꽤 훌륭하지만, 자주 * 변경하지 않는 파일에 더 적합 할 것입니다. 음악 파일, 사진, PDF 파일의 모음 ... –

+0

그 사람이 말한 것처럼 : 힘내 - 별관 멋지 네요! – dotancohen

관련 문제