Git 및 Mercurial을 사용한 부분 복제
Git 및 Mercurial에서 하나의 브랜치 (또는 주어진 커밋에서) 만 복제 할 수 있습니까? 내 말은, 중앙 저장소를 복제하고 싶지만 크기가 크므로 일부만 가져오고 여전히 변경 사항을 다시 기여할 수 있기를 원합니다. 가능합니까? 예를 들어, 저는 Tag 130 이상에서만 원합니다.
그렇다면 어떻게?
Git 랜드에서는 세 가지 유형의 부분 복제에 대해 이야기하고 있습니다.
얕은 클론 : 수정 지점 X 이후의 기록을 원합니다.
이를
git clone --depth <n> <url>
위해 사용 하지만 얕은 클론은 다른 저장소와 상호 작용하는 데 다소 제한됩니다. 패치를 생성하고 이메일을 통해 보낼 수 있습니다.파일 경로에 의한 부분 복제 : 일부 디렉토리의 모든 개정 내역 기록을 원합니다
/path
.Git에서는 불가능합니다 . 최신 Git을 사용하면 드물게 체크 아웃 할 수 있습니다 . 즉, 전체 내역이 있지만 모든 파일의 하위 집합 만 체크 아웃 (작업 영역에 있음) 할 수 있습니다.
선택한 브랜치 만 복제 : 하나의 브랜치 (또는 선택한 브랜치의 일부) 만 복제하고 싶습니다.
가능하고
간단하지 1.7.10 자식 전에 : 당신은 즉, 복제 수동으로 무엇을해야 할 것입니다
git init [<directory>]
, 다음git remote add origin <url>
, 편집.git/config
교체*
에remote.origin.fetch
다음, 요청 지점 (아마도 '마스터')로git fetch
.git 1.7.10부터는 이 목적을 위해 추가 된 것처럼 보이며 매우 쉬운 옵션을
git clone
제공합니다--single-branch
.그러나 브랜치는 일반적으로 대부분의 히스토리를 공유하기 때문에 브랜치의 하위 집합 만 복제하여 얻는 이득은 생각보다 작을 수 있습니다.
선택한 분기 하위 집합 만 얕은 복제를 수행 할 수도 있습니다.
사람들이 파일 경로 (동일한 저장소에있는 여러 프로젝트)별로 어떻게 분류하고 싶은지 알고 있다면 하위 모듈 (svn : externals와 같은 종류)을 사용하여 저장소를 개별적으로 복제 가능한 부분으로 미리 분할 할 수 있습니다.
수은 땅에서는 세 가지 유형의 부분 복제에 대해 이야기하고 있습니다.
- 얕은 복제본 : 수정 지점 X 이후의 기록을 remotefilelog 확장을 사용하고 싶습니다.
- 파일 경로 별 부분 복제 : 실험적 좁은 확장이있는 / path 디렉토리의 모든 개정 내역을 원하거나 / path 디렉토리의 파일 만 실험적 스파 스 확장 이있는 내 작업 디렉토리에 있기를 원합니다 (버전 4.3부터 제공됨 , 참조
hg help sparse
). - 분기 별 부분 복제 : 분기 Y의 모든 개정 내역을 원합니다 : 복제 -r 사용
사람들이 파일 경로 (동일한 저장소에있는 여러 프로젝트 (부끄러움))별로 어떻게 분류하고 싶은지 알고 있다면 하위 저장소 (svn 외부와 같은 종류)를 사용하여 저장소를 별도로 복제 가능한 부분으로 미리 분할 할 수 있습니다.
또한 "너무 거 대해서 일부만 얻고 싶어요"에 관해서는 정말 한 번만하면됩니다. 점심을 먹는 동안 복제하면 영원히 더 먹을 수 있습니다. 결과적 pull
으로 앞으로 효율적으로 델타를 얻을 수 있습니다 . 또 다른 복제본을 원하면 첫 번째 복제본을 복제하십시오. 클론이있는 위치는 중요하지 않습니다 (그리고 로컬 클론은 커버 아래의 하드 링크이기 때문에 추가 디스크 공간을 차지하지 않습니다).
선택한 답변은 좋은 개요를 제공하지만 완전한 예가 없습니다.
git clone --no-checkout --depth 1 --single-branch --branch (name) (repo) (folder)
cd (folder)
git config core.sparseCheckout true
echo "target/path/1" >>.git/info/sparse-checkout
echo "target/path/2" >>.git/info/sparse-checkout
git checkout
정기적으로 로컬 저장소 공간 최적화 (c) (선택 사항,주의해서 사용) :
git clean --dry-run # consider and tweak results then switch to --force
git gc
git repack -Ad
git prune
참고 항목 : git로 큰 저장소를 처리하는 방법
이 방법은 하위 저장소없이 버전없는 아카이브를 만듭니다.
hg clone -U ssh://machine//directory/path/to/repo/project projecttemp
cd projecttemp
hg archive -r tip ../project-no-subrepos
하위 저장소가없는 버전없는 소스 코드는 project-no-subrepos 디렉토리에 있습니다.
Git과 관련하여 Linus Torvalds가 2007 년에 온라인으로 녹음 된 강연에서 개념적 관점에서이 질문에 답변 한 것은 역사적 의미가있을 수 있습니다.
문제는 Git 저장소에서 일부 파일 만 체크 아웃 할 수 있는지 여부입니다.
테크 토크 : Linus Torvalds on git t = 43 : 10
To summarize, he said that one of the design decisions of Git that sets it apart from other source management systems (he cites BitKeeper and SVN) is that Git manages content, not files. The implications being that e.g. a diff of a subset of files in two revisions is computed by first taking the whole diff and then pruning it only to the files that were requested. Another is that you have to check out the whole history; in an all or nothing fashion. For this reason, he suggests splitting loosely related components among multiple repositories and mentions a then ongoing effort to implement an user interface for managing a repository that is structured as a super-project holding smaller repositories.
As far as I know this fundamental design decision still apples today. The super-project thing probably became what now are submodules.
In mercurial, you should be able to so some of this using:
hg convert --banchmap FILE SOURCEDEST REVMAP
You may also want:
--config convert.hg.startrev=REV
The source can be git, mercurial, or a variety of other systems.
I haven't tried it, but convert is quite rich.
참고URL : https://stackoverflow.com/questions/2586824/partial-clone-with-git-and-mercurial
'programing tip' 카테고리의 다른 글
코드에서 이벤트 핸들러를 호출하는 것은 왜 나쁜 습관입니까? (0) | 2020.10.24 |
---|---|
jquery가 게시물 작업 URL을 가져옵니다. (0) | 2020.10.24 |
Vim에서 자동 접기를 활성화하려면 어떻게해야합니까? (0) | 2020.10.24 |
콜백을 매개 변수로 다른 함수에 전달하는 방법 (0) | 2020.10.24 |
Python에서 YAML 파일을 구문 분석하고 데이터에 액세스합니까? (0) | 2020.10.24 |