git에 대해 내가 싫어하는 점은 다음과 같습니다.
우선 분산 된 아이디어가 현실 앞에서 날아 간다고 생각합니다. 실제로 git을 사용하는 모든 사람은 중앙 집중식 방식으로 수행합니다. Linus Torvalds도 마찬가지입니다. 커널이 분산 된 방식으로 관리 되었다면 실제로 "공식"커널 소스를 다운로드 할 수 없었습니다.-하나도 없을 것입니다. Linus 버전을 원하는지 Joe 버전을 원하는지 결정해야합니다. 또는 Bill의 버전. 그것은 분명히 말도 안되는 일이며 Linus가 중앙 집중식 워크 플로를 사용하여 제어하는 공식 정의가있는 이유입니다.
중앙 집중식 정의를 원하면 서버와 클라이언트 역할이 완전히 다르기 때문에 클라이언트와 서버 소프트웨어가 동일해야한다는 교리가 순전히 제한적입니다. 클라이언트와 서버 데이터 가 동일해야한다는 신조는 특히 누구도 신경 쓰지 않고 모두 복제해야하는 15 년의 역사를 가진 코드베이스에서 엄청나게 우스꽝 스럽습니다.
우리가 실제로 그 모든 오래된 물건으로하고 싶은 것은 그것을 찬장에 넣고 거기에 있다는 사실을 잊는 것입니다. 일반 VCS처럼 말입니다. git이 매일 네트워크를 통해 모든 것을 앞뒤로 운반한다는 사실은 매우 위험합니다. 가지 치기에는 지루한 결정이 많이 필요하며 잘못 될 수 있습니다. 그래서 사람들은 아마도 역사의 다양한 지점에서 일련의 스냅 샷 리포지토리를 보관할 것입니다.하지만 처음에는 소스 제어가 무엇 이었습니까? 이 문제는 누군가가 분산 모델을 발명 할 때까지 존재하지 않았습니다.
힘내는 사람들이 역사를 다시 쓰도록 적극 장려하며, 위의 이유가 아마도 그 이유 중 하나 일 것입니다. 모든 일반 VCS는 관리자를 제외한 모든 사람이 기록을 다시 작성할 수 없도록하며 관리자가이를 고려할 이유가 없도록합니다. 내가 틀렸다면 정정하십시오.하지만 내가 아는 한 git은 일반 사용자에게 쓰기 권한을 부여하는 방법을 제공하지 않지만 기록을 다시 작성하지 못하도록 금지합니다. 이는 원한이있는 개발자 (또는 여전히 학습 곡선에 어려움을 겪고있는 개발자)가 전체 코드베이스를 폐기 할 수 있음을 의미합니다. 그걸 어떻게 조이나요? 글쎄, 당신은 전체 역사의 정기적 인 백업을 만들거나, 즉 당신은 역사를 제곱 한 상태로 유지하거나, 이메일로 모든 차이를 받아 손으로 병합하는 가난한 잔디를 제외한 모든 사람에 대한 쓰기 액세스를 금지합니다.
자금이 잘 조달 된 대규모 프로젝트의 예를 들어 git이 Android에서 어떻게 작동하는지 살펴 보겠습니다. 나는 한때 안드로이드 시스템 자체를 가지고 놀기로 결정했습니다. 나는 그들의 자식을 얻기 위해 repo라는 스크립트를 사용해야한다는 것을 알았습니다. 일부 repo는 클라이언트에서 실행되고 일부는 서버에서 실행되지만 둘 다 존재하는 것만으로도 git이 어느 쪽 용량에서든 불완전하다는 사실을 보여줍니다. 무슨 일이 있었는지 나는 약 일주일 동안 소스를 가져 오지 못하고 모두 포기했다. 여러 저장소에서 엄청나게 방대한 양의 데이터를 가져와야했지만 서버는 저와 같은 사람들로 인해 과부하 상태였습니다. Repo는 시간이 초과되어 시간이 초과 된 위치에서 다시 시작할 수 없습니다. git이 그렇게 배포 가능하다면, 당신은 그들이 d는 하나의 서버에 대한 부하를 줄이기 위해 일종의 피어 투 피어 작업을 수행했습니다. Git은 배포 가능하지만 서버가 아닙니다. Git + repo는 서버이지만 repo는 배포 할 수 없습니다. 단지 임시적인 해킹 모음이기 때문입니다.
git의 부적절 함을 보여주는 비슷한 예는 gitolite (그리고 그 조상은 잘 작동하지 않은 것 같습니다.) Gitolite는 git 서버의 배포를 용이하게하는 역할을 설명합니다. 다시 말하지만, 이것의 존재 자체는 git이 서버가 아니라 클라이언트라는 것을 증명합니다. 더군다나, 그것이 둘 중 하나로 성장한다면 그것은 창립 원칙을 배반 할 것이기 때문입니다.
분산 된 것을 믿더라도 git은 여전히 엉망 일 것입니다. 예를 들어 분기 란 무엇입니까? 그들은 당신이 저장소를 복제 할 때마다 암시 적으로 분기를 만든다고하지만, 그것은 단일 저장소의 분기와 같을 수 없습니다. 그래서 그것은 브랜치라고 불리는 적어도 두 가지 다른 것입니다. 그러나 그런 다음 repo에서 되 감고 편집을 시작할 수도 있습니다. 두 번째 유형의 가지와 같습니까, 아니면 또 다른 것입니까? 보유하고있는 저장소 유형에 따라 다를 수 있습니다.-오 예-분명히 저장소도 매우 명확한 개념이 아닙니다. 정상적인 것과 맨손이 있습니다. 베어 파트가 소스 트리와 동기화되지 않을 수 있으므로 일반 파트로 푸시 할 수 없습니다. 그러나 그들이 생각하지 않았기 때문에 맨손으로 cvsimport를 할 수 없습니다. 따라서 cvsimport를 일반 파일로 가져와야합니다. 개발자가 히트 한 베어에 복제하고 cvs에 cvs로 체크인해야하는 cvs 작업 복사본으로 cvsexport합니다. 누가 귀찮게 할 수 있습니까? 이 모든 합병증은 어디에서 왔습니까? 분산 된 아이디어 자체에서. 나는 이러한 제한을 더 많이 부과했기 때문에 결국 gitolite를 버렸다.
Git은 브랜치가 가벼워 야한다고 말하지만 많은 회사는 이미 심각한 불량 브랜치 문제를 가지고 있으므로 엄격한 정책을 통해 브랜칭이 중요한 결정이어야한다고 생각했습니다. 이것은 perforce가 정말로 빛나는 곳입니다 ...
Perforce에서는 매우 민첩한 방식으로 변경 집합을 처리 할 수 있으므로 분기가 거의 필요하지 않습니다. 예를 들어 일반적인 워크 플로는 메인 라인에서 마지막으로 알려진 양호한 버전과 동기화 한 다음 기능을 작성하는 것입니다. 파일을 수정하려고 할 때마다 해당 파일의 diff가 "기본 변경 집합"에 추가됩니다. 변경 세트를 체크인하려고하면 자동으로 메인 라인의 뉴스를 변경 세트로 병합 (효과적으로 리베이스) 한 다음 커밋합니다. 이 워크 플로는 사용자가 이해할 필요없이 시행됩니다. 따라서 Mainline은 나중에 쉽게 선택할 수있는 변경 내역을 수집합니다. 예를 들어, 이전 항목, 예를 들어 이전 항목을 되돌리고 싶다고 가정합니다. 문제가되는 변경 전 순간에 동기화하고 영향을받는 파일을 변경 집합의 일부로 표시하고 순간에 동기화하고 "항상 내"와 병합합니다. (매우 흥미로운 점이 있습니다. 동기화가 동일한 것을 의미하는 것은 아닙니다. 파일을 편집 할 수있는 경우 (즉, 활성 변경 집합에있는 경우) 동기화에 의해 방해되지 않지만 해결 예정으로 표시됩니다. 문제를 일으키는 변경 목록을 실행 취소합니다. 후속 뉴스를 합치면 원하는 효과를 내기 위해 메인 라인 위에 올라갈 수있는 변경 목록이 있습니다. 어떤 시점에서도 우리는 역사를 다시 쓰지 않았습니다. 후속 뉴스를 합치면 원하는 효과를 내기 위해 메인 라인 위에 올라갈 수있는 변경 목록이 있습니다. 어떤 시점에서도 우리는 역사를 다시 쓰지 않았습니다. 후속 뉴스를 합치면 원하는 효과를 내기 위해 메인 라인 위에 올라갈 수있는 변경 목록이 있습니다. 어떤 시점에서도 우리는 역사를 다시 쓰지 않았습니다.
자,이 과정의 중간 쯤에 있다고 가정하면 누군가가 당신에게 달려 가서 모든 것을 버리고 버그를 수정하라고 말합니다. 기본 변경 목록에 이름 (실제로 숫자)을 지정한 다음 "일시 중지"하고, 비어있는 기본 변경 목록의 버그를 수정하고, 커밋 한 다음 명명 된 변경 목록을 다시 시작하면됩니다. 여러 가지를 시도하는 한 번에 여러 변경 목록을 일시 중단하는 것이 일반적입니다. 쉽고 사적입니다. 당신은 미루거나 메인 라인으로 합병하지 않고 지부 정권에서 정말로 원하는 것을 얻습니다.
나는 이론적으로 git에서 비슷한 일을 할 수 있다고 생각하지만 git은 우리가 승인 한 워크 플로를 주장하기보다는 사실상 모든 것을 가능하게 만든다. 중앙 집중식 모델은 유효하지 않은 일반화 인 분산 모델과 관련된 유효한 단순화입니다. 너무 일반화되어 기본적으로 repo처럼 소스 제어를 구현할 것으로 예상합니다.
다른 것은 복제입니다. git에서는 모든 것이 가능하므로 스스로 알아 내야합니다. Perforce에서는 효과적으로 상태 비 저장 캐시를 얻습니다. 알아야 할 유일한 구성은 마스터가있는 위치이며 클라이언트는 재량에 따라 마스터 또는 캐시를 가리킬 수 있습니다. 그것은 5 분의 일이며 잘못 될 수 없습니다.
또한 코드 리뷰, 버그질라 참조 등을 주장하기위한 트리거와 사용자 정의 가능한 양식이 있으며, 물론 실제로 필요할 때를위한 분기도 있습니다. 명확한 케이스는 아니지만 가깝고 설정 및 유지 관리가 쉽습니다.
대체로 중앙 집중식으로 작업 할 것이라는 것을 알고 있다면 모두가 그렇게하는 것을 염두에두고 설계된 도구를 사용하는 것이 좋습니다. Git은 Linus의 무시 무시한 재치와 사람들이 양처럼 서로를 따라 다니는 경향 때문에 과대 평가되었지만, 그 주된 이유는 실제로 상식에 맞지 않으며, git은 자신의 손을 (a) 소프트웨어와 (b) 데이터가 클라이언트와 서버 모두에서 동일해야한다는 두 개의 거대한 교리로, 중앙 집중식 작업에서는 항상 복잡하고 절름발이가 될 것입니다.