2011-04-24 5 views
9

저는 지난 몇 주 동안 Git을 배웠고 SVN과 비교할 때 실제로 작동하는 방식을 정말 좋아합니다. 필자가 완전히 전환하려고하는 주된 이유는 병합이 거의 충돌이 거의없이 쉽고 로컬로 커밋 할 수 있다는 사실입니다. 이것은 여러 가지 (티켓/이슈/태스크/등당 지점과 같은)의 사용을 촉진하고 많은 커밋을 촉진합니다. (SVN에서 병합이 자주 발생하기 때문에) 분기 만 사용하고 문제가 해결 될 때만 커밋합니다 (증분 커밋 대신 더 좋을 것입니다).Git과 비 텍스트 파일/대형 프로젝트가 포함 된 SVN

지금 제가 읽고있는 글은 글자가 아닌 파일/큰 프로젝트에 관한 것입니다. 예를 들어 SVN에서 현재 통제되고있는 게임 프로젝트에 참여하고 있습니다. 이제 게임 프로젝트에서 미술, 사운드 및 기타 바이너리 파일과 같은 비 텍스트 파일이 많아지고 일부 파일은 상당히 커질 수 있습니다. git은 비 텍스트 파일/큰 바이너리 파일을 얼마나 잘 처리합니까? 그런 프로젝트를 git로 포팅하고 싶다면 무엇을 염두에 두어야할까요?

+0

Artifactory 또는 비슷한 버전의 대용량 파일을 저장하는 데 고려한 적이 있습니까? http://www.jfrog.com/artifactory – Nick

답변

0

git이 바이너리 파일을 완벽하게 처리합니다. 바이너리 파일의 모든 버전이 로컬에 보관된다는 것을 명심하기 만하면됩니다. 바이너리 파일 (이미지라고 가정 해 봅시다)이 자주 변경되면 로컬 공간을 모든 이미지 버전으로 채우게됩니다.

+0

git이 바이너리를 압축하는 데 좋은 경험을 한 것은 나의 경험이다. 'git pack' 또는'git gc'를 한번만 기억하십시오. – sehe

+0

SVN이 바이너리를 다르게 처리하거나 여기에 언급 된 것과 동일하게 처리합니까 (각 버전에 대한 파일의 전체 사본 저장)? – ryanzec

+0

git을 사용하면 로컬 저장소에서 전체 히스토리가 있어야하므로 svn 프로젝트보다 많은 공간을 소비하게됩니다. svn을 사용하여 원하면 원격 repo를 다운로드해야합니다 (서버에는 모든 기록이 있음). 자식과 함께 이미 모든 버전이 로컬에 있습니다. – ALoR

5

Git이 다른 버전 제어 시스템과 비교하여 데이터를 저장하는 방법의 큰 차이점 중 하나는 Git이 파일 내용을 단일 객체로 완전히 저장한다는 것입니다. 이는 모든 파일의 모든 버전이 저장소에 전체 파일로 존재 함을 의미합니다 (매우 압축 됨). 따라서 다른 VCS는 두 버전 사이에 차이점/델타를 저장하지만 바이너리 파일과 텍스트 파일을 다르게 처리합니다 (바이너리 파일은 차이가 없기 때문에), Git은 모든 것을 동일하게 처리합니다.

마찬가지로 Git에서 이진 파일로 작업하는 것은 다른 파일 형식을 사용하는 것과 다르지 않습니다. 대용량 파일의 버전을 지정하면 저장소 크기가 크게 증가한다는 사실을 기억해야합니다 (실제 파일 크기가 작 으면 큰 파일의 모든 단일 버전이 그대로 저장됩니다). 힘내의 압축은 그러나 경이로움을 작동하고 당신이 이것을 보통 알지 못하게 만든다. 특히 프로그램의 자산에 대해서만 이야기하는 경우에는 어려움이 없을 것입니다. 포크의 대답 @ 추가

+9

각 개체는 처음에는 개별 파일입니다. 충분한 커밋이나 repo가'gc''d 될 때, 또는 복제 할 때, 그것들은 deltified되고 압축되어 저장소의 크기를 subversion 저장소와 경쟁하게 만듭니다. –

+0

@jleedev : "완전한 파일로 존재한다"는 말은 파일 (내용)이 완전하게 저장된다는 것입니다. 블롭을 저장하는 하나의 파일이 반드시 필요하지는 않습니다. 앞에서 말했듯이 Git의 압축은 매우 효과적이므로 각 파일 버전이 저장소에 독립적으로 저장된다는 것을 알지 못합니다. – poke

+0

그것은 단지 당신의 추상화 수준에 달려 있습니다. 그러나 보통 당신이 그것을 알아 차리지 못한다는 것은 사실입니다. –

1

내가 요즘 열렬한 망할 놈의 사용자,하지만 바이너리 파일을 많이 있었다 거대한 프로젝트에 종사 한

- 대부분 지퍼 - 처리 할 수 ​​- 난 SVN 더 효율적으로 발견 젠장. 비슷한 SVN 저장소의 크기는 많이 변하지 않았지만 Git 저장소의 크기는 부풀려졌습니다. 특히 지리적으로 분산 된 장소에서 거대한 Git repo를 복제하는 것은 악몽이었습니다. 힘내 또한 부분 복제 기능이 없다. 우리가 SVN에서 항상하는 일이다. 특정 폴더 만 체크 아웃한다. git에서 부분적인 체크 아웃이 있지만 전체 repo를 복제해야합니다. 파일이 바이너리인지 여부를 저장하는 데 사용 저장소 공간의 크기에 영향을주지 않습니다

참고 해당 파일에 을 변경 않으며 클라이언트와 서버 사이의 트래픽의 양에 영향을 미치지 않습니다. 저장소 및 전송 목적을 위해 Subversion은 바이너리 및 텍스트 파일에서 똑같이 잘 작동하는 차이점 방법을 사용합니다. 이것은이고 'svn diff'명령에 의해 사용 된 차이점 과 전혀 관련이 없습니다.

http://subversion.apache.org/faq.html#binary-files

을 감안할 때 SVN의 성숙 SYS 관리 도구 (힘내는 지난 몇 년 동안 개선했다,하지만 난 SVN 여전히 이러한 측면에서 우위를 가지고 느낌) 나는와 SVN 서버가 현명 할 것이라고 생각 로컬 개발을위한 git-svn repo.

git-bigfiles가 있습니다. 이것은 git의 포크입니다. 그것이 얼마나 성숙한 지 잘 모릅니다. 당신은 그것을 평가할 수 있습니다. 그러나 그것이 존재한다는 사실은, 힘내는 대용량 파일을 다루는데 반드시 좋은 것은 아니라는 것을 보여준다.

+1

먼저 zip 자체가 이미 압축되어 있으므로 gzip 압축 git이 적용됩니다. 둘째로 저장소를 반드시 복제 할 필요는 없습니다. 실제로 복제는 처음부터 로컬 저장소를 설정하기 위해 수행하는 작업입니다. 그러나 다른 저장소를 리모컨으로 추가 한 다음 지점 등을 부분적으로 가져올 수 있습니다. – poke

+0

계속해서 이진 파일을 변경하지 않는 한 (예 : 편집기에서 이진 형식 (예 : Flash IDE의 .fla 파일)을 사용하는 경우) Git을 사용하여 바이너리 * assets * (사운드, 이미지)을 저장하는 것은 전혀 문제가되지 않으며, 특히 작은 단점은 Git을 처음 사용했을 때 얻을 수있는 이점보다 비싸지 않을 것입니다. – poke

+1

복제에 대한 내 이해가 없다고 생각합니다. 새 로컬 저장소를 설정해야하는 경우 클론이 일회성 작업 인 것과 관계없이 복제해야합니다. 그리고 특정 분기를 가져 오는 것은 여전히 ​​SVN 세계에서 부분적이지 않습니다. 모든 대형 프로젝트 프로젝트에서 바이너리 파일은 매우 자주 변경 될 것입니다. 자산을 포함합니다. Alteast는 서브 세트로, 문제점을 제공하기에 충분합니다. – manojlds

0

다른 답변은 여기에서 선택 사항을 다루었지만 바이너리 파일 (SVN이 많이 변경되는 경우) 및 기타 모든 항목에 대해 SVN을 사용할 수도 있습니다. 빌드 단계에서 스크립트를 사용하여 svn에서 이진 리소스를 가져올 수 있습니다.

관련 문제