2009-08-19 2 views
19

소스 제어에 많은 하위 디렉토리가있는 프로젝트가 있다고 가정합니다. 그 중 많은 부분은 현재 필요하지 않습니다.bazaar, mercurial 또는 git를 사용하여 부분 복제/분기를 수행 할 수 있습니까?

전체 트리 중 일부만 포함하는 작업 복사본을 만들고 싶습니다. 변경 내용을 적용하고 커밋 한 다음 다시 밀어 넣을 수 있습니다.

가능한가요, 그렇다면 어떻게 할 수 있습니까?

나는 아직도 바자 또는 수은과 관련이 있는지 결정 중이므로 그 중 하나에 관한 답변이 도움이 될 것입니다.

편집 : 사실, git 용 솔루션도 유용 할 것입니다.

답변

10

이미 저장소가 있고이를 수행하려는 경우 고통이 될 것입니다.

새로운 저장소로이 작업을 수행하려는 경우 Mercurial의 새로운 subrepos을 볼 수 있습니다.

은 기본적으로 당신은 특정 디렉토리에 대한 독립 저장소를 만들 :

myproject/ 
    .hg/ 
    source code/ 
     ... files here ... 
    documentation/ (subrepo) 
     .hg/ 
     ... files here ... 
    graphics/ (subrepo) 
     .hg/ 
     ... files here ... 

이 다른 저장소에서 프로젝트의 다른 조각을 분리합니다. "포함하고있는"repo (이 경우 myproject)는 커밋 할 때마다 하위 레프가 어떤 수정 버전인지 추적합니다. 제가 언급 한 subrepo wiki 페이지는 그것을 잘 설명합니다.

6

this wiki page에서 볼 때이 기능은 Mercurial에는 아직 구현되지 않았지만 실제 분기가 아닌 저장소 또는 그 부분을 '변환'하여 원하는대로 할 수있는 extension이 있습니다. Hg에서 Hg로 변환 할 수 있으므로 부분 복제로 작동 할 수 있습니다. 이게 니가 필요한거야?

+2

을이 유용한 답변입니다, 중요한주의 사항에주의하십시오 :'hg convert'는 저장소의 일부만의 복제본을 얻을 수있게합니다. 그러나 changesets는 원래의 changesets와 동일한 SHA-1 ID를 가지지 않습니다. 원래의 저장소로 되돌릴 수는 없지만 (적어도 안전하지는 않음), 변경 사항을 다시 이식하는 것을 수동으로 관리 할 수는 있습니다 (예 :'hg transplant'). 장기간의 복제에도 이상적이지 않습니다. – quark

4

대부분의 DCVS에서 규칙은 "1 project == 1 repository"입니다. "서브 프로젝트"에 대한 개념은 없습니다 (서브 트리를 체크 아웃하고 그 작업을 할 수있는 Subversion과는 다릅니다).

"프로젝트"에는 루트 폴더에 전체 리포지토리의 복사본이 포함되어 있습니다. 하위 폴더에 전체 저장소의 복사본을 만들 수 있다면 상황이 상당히 복잡해집니다.

더하기 측면에서 작업 복사본을 만드는 것은 빠른 작업입니다 (기본 파일 시스템이 느린 경우는 예외).

14

내가 아는 한 트리의 하위 집합을 복제 할 수는 없지만 다른 가능성이 있습니다.

힘내 : 명령 git clone--depth 플래그가 : 역사는 개정 지정된 수의 잘립니다와

--depth <depth>

얕은 복제를 만듭니다. 얕은 저장소는 많은 제한이 있습니다 (복제하거나 가져 오거나 가져올 수 없으며 그로부터 푸시하거나 푸시 할 수 없지만), 오랜 역사를 가진 대형 프로젝트의 최근 히스토리에만 관심이 있다면 충분합니다. 수정 사항을 패치로 보내십시오.

바자 다음 checkout 명령에 대한 플래그 --lightweight 만 작업 디렉토리 대신 전체 역사를 다운로드하고 대역폭 및 디스크 공간을 절약 할 수 있습니다. 모든 작업은 계속 지원되지만 작업을 수행하려면 네트워크 연결이 필요합니다.

Merurial에이 기능이 있는지 여부를 알 수 없습니다.

3

Bazaar의 경우 하위 프로젝트에서 큰 프로젝트를 분할 할 수있는 http://bazaar-vcs.org/NestedTreesDesign 중첩 트리가 있습니다.
아직이 기능을 사용하지 않았으므로 작동 여부를 잘 모릅니다.

--hardlink를 사용하여 파일 묶음을 복사하지 않도록 할 수도 있습니다 (Windows에서 작동하는지 확실하지 않음 ...)), 작업이없는 분기 (더 가벼운 분기) 또는 작업 트리가없는 분기 (파일 없음, 기록 만).

+3

이것은 다른 DVCS에서도 지원됩니다 : ** Git **의 git-submodule이고, ** Mercurial **의 Forest Extension **이라고 생각합니다. 그러나 원래 포스터가 묻는 내용과 접하게 관련된 것일뿐입니다. 추가 설치가 필요하기 때문입니다. –

+0

이들은 내가 링크 된 페이지에 언급되어 있습니다. 방금 ​​시도 : 기존의 테스트 트리에서 분할을 사용하여 변경 사항을 커밋 한 다음 하위 트리를 분기하여 작동했습니다. 적어도 bzr을 위해 선행을 할 필요가 없습니다. – PhiLho

+2

@ Jakub : Forest 확장 기능이 필요 없습니다. SubRepos가 1.3의 Mercurial 코어에 추가되었습니다. –

5

자식, 당신은 당신이 다음, 단지 특정 하위 프로젝트에 대한 "가상"저장소를 추출 하위 프로젝트에서 변경 한 다음 다시 그 변경 내용을 병합 할 수있는 git subtree를 사용할 수 있습니다.