2016-06-22 2 views
2

Linux Kernel을 예로 들어 보겠습니다. 로컬 사본을 갖고 싶지만 최근 기록에만 관심이 있다고 가정 해 봅시다.이 저장소는 거대한 역사가 있기 때문에 얕은 복제를 수행하여 git 작업이 더 빠르게 작동하도록합니다 (구문 분석 할 필요가 없습니다). 전체 역사는 매번, 우리가 가지고있는 것만 로컬로).git 저장소를 모든 커밋으로 다시 복제하십시오. 모든 것이 아닌

좋아요, 우리가 얼마나 멀리 가져올 필요가 있는지 알아 보겠습니다. 예를 들어, v4.0이 우리가 원하는만큼 멀리 있다고한다면, 이것을 --depth으로 어떻게 변환할까요?

$ git rev-list --count v4.0..torvalds/master 
95302 

그래서, v4.0부터 마스터 95302 커밋이 있었다 올바른 깊이해야처럼 맞아, 소리? 시도해 보겠습니다.

$ git clone --depth=95302 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
Cloning into 'linux'... 
remote: Counting objects: 4791958, done. 
remote: Compressing objects: 100% (3558/3558), done. 
remote: Total 4791958 (delta 2188), reused 640 (delta 174), pack-reused 4788216 
Receiving objects: 100% (4791958/4791958), 1.49 GiB | 12.93 MiB/s, done. 

많은 것을 가져온 것처럼 보입니다. 얼마나 멀리 되돌아가는 지 보자.

$ git -C linux tag | head 
v2.6.12 
v2.6.12-rc2 
v2.6.12-rc3 
v2.6.12-rc4 
v2.6.12-rc5 
v2.6.12-rc6 
v2.6.13 
v2.6.13-rc1 
v2.6.13-rc2 
v2.6.13-rc3 

OK, 우리는 여기에서 너무 많은 것을 분명히 가져 왔습니다.

가져 오는 양을 계산하려면 어떻게해야합니까? 어떤 --depth을 요청 하시겠습니까?

편집 :이 명확하게하기 위해, 목표는 (은 그 후 새로운 커밋을 가져올 수 있도록 허용하는 경우 얕은 복제가하는 것처럼, 보너스 포인트) 일부 커밋 과거와 현재 사이의 역사를 가지고하는 것입니다. 히스토리를 파기하는 답변 (예 : 지금까지 제공 한 답변)은 분명히이를 만족시키지 않습니다.

방금 ​​전에 우리가 원하는 커밋 이전에 스쿼시 버전의 이력을 접목 할 수있는 약 git-replace을 알았습니다. 나는 그것을 줄 것이며 결과에 따라이 질문/답변을 업데이트 할 것이다.

+0

아직 복제본이 없으면 일반적으로 사용할 수 없기 때문에 바보 같지만 * 커밋 *이 아닌 * 깊이 *를 계산해야합니다 (후자는 폭을 포함합니다 : 간단한 예 : 분기 X의 팁이 병합하고 X^~ X ^^ 또는 X^2 ~ X ^^에 따라 목표를 달성하기 위해 2 개의 커밋을 다시 수행해야합니다. 'rev-list --count'는 fencepost 오류를 제외하고는 3을 계산합니다. '- 경계가 없다 '). '--first-parent'는 항상 작동하지 않지만'--ancestry-path'와 마찬가지로 시작입니다. 또한 복제 단계에서'--single-branch'를 원할 수도 있습니다. – torek

+0

@torek,'--single-branch'는'--depth'에 내포되어 있습니다. – AnoE

+0

@AnoE : 오, 알았어요. 그렇습니다! 감사. – torek

답변

0

우리는 최근의 역사에만 관심이 ... 어떻게 우리는 당신이 전체 복제를 한 후 필수가 데이터를 장하지 않는 한 --depth

에 당신 캔트 그것을 할 것을 변환합니까 . ,

  1. 클론 전체의 repo 후 고아 분기와 체리가 끝까지 원하는 지점에서 모든 커밋을 선택 만들 :

    는 몇 가지 방법을 가지고 그것을합니다. 위의 유사

  2. : 다음

    git clone --branch <tag_name> <repo_url> 
    # or 
    git checkout tags/<tag_name> 
    
  3. clone와 커밋을 하나에 모든 커밋을 결합하여 원하는 지점 + squashreset --hard을 수행합니다.

+0

당신의 대답은 "나는 대답이 없지만이 다른 일을 할 수 있느냐"는 것입니다. 귀하의 제안에 회신 하시려면 : (1)과 (3)은 역사를 잃어 버리고, 역사를 처음부터 말하려고 시도하는 모든 점을 무효화하고, (2) 질문에서 아무것도 만족시키지 못합니다. 나는 역사를 잃는 것이 비생산적이라는 것을 분명히하기 위해 질문을 편집 할 것이다. – 1ace

2

저는 자식이 정확히 주어진 커밋으로 복제하는 방법을 제공하지 않는다고 생각합니다. rev-list 이상은 --depth과 호환되는 카운트를 출력하기에 충분한 옵션이없는 것 같습니다.

당신은 패션에, 비록 git clone --depth와 함께 할 수 있습니다 (주석에 대한주의 : 나는 전체 훈련이 최종 저장소에 cruft에를 방지하기위한 것입니다 가정, 당신은 초기에 문제가 하지 것을 그것은해야 .... 작은 인간의 추론에있다

git clone --depth=95302 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux-95k 

git clone --depth=10000 file://`pwd`/linux-95k linux 

# oops, too little! 

rm -rf linux 
git clone --depth=50000 file://`pwd`/linux-95k linux 

# oops, still too much! 

... 

, 이진 검색 : 네트워크 사용 즉, 전체 다운로드, 당신에 대한 문제가 없다, 당신은 일시적으로 더 큰 저장소)를 저장할 수있는 충분한 하드 디스크 공간이 너무 많은 시도를하지 않고 스크립트를 작성할 수 있습니다.

EDIT : 답변이 변경되어 네트워크를 통해 한 번만 다운로드됩니다.

+0

"너무 많은 시도를해서는 안됩니다. (10-15 정도의 순서로)"→ 당신이 조업 중이라고 말할 수는 없지만, 그렇지 않은 경우를 대비해서 : 리눅스 커널은 2 1 0 - 2 ¹5 (1k - 32k)가 커밋됩니다. 현재 'master'에는 602598 커밋이 있으며, 복제본을 만들면 매번 평균 1GB (1 ~ 1.6GB)의 용량을 다운로드하게되므로 솔루션이 가장 비효율적 일뿐만 아니라 막대한 양의 대역폭을 낭비 할 수 있습니다 뿐만 아니라 실행하는 데 걸릴. – 1ace

+0

나는 트롤링 중이 아닙니다. 우리는 포스터가 이미 95000 커밋의 상한선을 발견 602598 커밋을 말하는 게 아니야. 'log2 (95000) = 17'은 2 진 검색의 상한선이됩니다. 그는 로컬 복제본을 복제하여 반복 다운로드를 피할 수 있습니다. 그리고 경의를 표하며 리눅스 커널의'--depth = 1' 클론 120MB조차도 Youtube & Co가 매일 스트리밍하는 방대한 양의 데이터와 비교하면 아주 적은 양의 데이터입니다! 나는 그가 한 번 이상 처음부터 올바른 동작을하지 않을 것이라고 생각한다. – AnoE

+0

좋아요, 사과드립니다. 제가 한 것처럼 대답해서는 안됩니다. 그렇습니다. 로컬 복제본은 네트워크에서 가져 오는 것보다 빠르며 낭비가 적습니다.하지만이 무차별 기술은 실제로 좋지 않습니다. 그리고'v4.0' 예제는 단지 그 예입니다. 실제 값은 (더 큰면에서) 다양합니다.하지만 나는 다른 것들이 더 크다는 점을 잘 알고 있습니다. 어쨌든, 최선의 방법 (주관적)이 아니더라도 질문에 답하는대로 답변을 upvoted. 나는 (오늘이 아니라) 시간이되면'git-replace'를 들여다 볼 것입니다. 조금 전에 엉덩이가되어서 미안 : ( – 1ace

관련 문제