2010-07-10 6 views
12

나는 접선으로 관련된 두 개의 git 저장소가 있습니다. 즉, 하나의 콘텐츠는 다른 콘텐츠의 전신이었습니다. 나는 어쨌든 보관소 A의 전체 역사를 보관함 B에두고 싶습니다. 그래서 A의 끝은 저장소 B의 첫 번째 변경 집합의 부모가 될 수 있습니까? 양쪽 모두의 역사는 꽤 직선적입니다.두 개의 git 이력을 연결하는 방법은 무엇입니까?

이것이 가능합니까?

답변

9

당신은 당신이

도 참조 "What are .git/info/grafts for?"와 "How to prepend the past to a git repository?"(projectB 부모 projectA의 최신에 대해 갖는 첫 번째처럼) 커밋의 부모를 덮어 쓸 수 이식 파일 (.git/info/grafts)를 사용하여 시도해 볼 수도 있습니다 이 조작에 대한 자세한 내용은 구체적인 예를 들어 (SO 사용자 Ben Straub에서) 기사 ​​"Git: Grafting repositories"에 대한


skaleecomments.

지금 우리가하고 싶은 것은 먼저 부모는 마지막으로 "오래된"의 repo에 커밋되도록 " nuevo"REPO (" New commit #1")에 커밋 변경 ("# 3 올드")입니다. 일부 부두에 대한 시간 : 힘내이 환매 특약은 그와 관련 여부, 다른 자식 저장소에서 가져올 수 있습니다

git fetch ../old master:ancient_history 

! 훌륭한! 이것은이 우리를 잎 : 우리가 ancient_history에 이전 마스터 브랜치의 이름을 변경

enter image description here

참고 방법에 대해 설명합니다. 우리가하지 않았다면, 자식은 두 개를 합치려고 했었을 것이고 아마도 혐오 스러움에서 포기했을 것입니다.

이제 우리는 여전히 문제가 있습니다.
두 나무가 연결되어 있지 않으며 실제로 git pull은 ancient_history 분기를 전혀 얻지 못합니다. 우리는 둘 사이를 연결하는 방법이 필요합니다.

힘내 기는 기본적으로 두 가지 커밋 사이의 부모 링크를 가짜로 만드는 이식 (graft)이라고하는 기능이 있습니다.
는이 형식으로 .git/info/grafts 파일에 행을 삽입, 하나를 만들려면 : 다음의

[ref] [parent] 

모두 해당 커밋의 전체 해시해야합니다. 그래서 그들을 찾을 수 있습니다 :

$ git rev-list master | tail -n 1 
d7737bffdad86dc05bbade271a9c16f8f912d3c6 

$ git rev-parse ancient_history 
463d0401a3f34bd381c456c6166e514564289ab2 

$ echo d7737bffdad86dc05bbade271a9c16f8f912d3c6 \ 
     463d0401a3f34bd381c456c6166e514564289ab2 \ 
     > .git/info/grafts 

echo $(git rev-list master | tail -n 1) $(git rev-parse ancient_history) > .git/info/grafts 

이 (ssokolow에 의해 suggested로 한 줄에).이제 우리의 역사는 다음과 같습니다이이 REPO 결과를 복제

enter image description here

:

enter image description here

Woops합니다. 그라프 트는 로컬 저장소에만 적용됩니다. 우리는 git fast-import의 사려 분별이 응용 프로그램과 함께이 문제를 해결할 수 있습니다

$ git fast-export --all > ../export 

$ mkdir ../nuevo-complete 

$ cd ../nuevo-complete 

$ git init 

$ git fast-import < ../export 
git-fast-import statistics: [...] 

git filter-branch $(git rev-parse ancient_history)..HEAD 

이 효율적으로 우리의 "가짜"역사 링크로 변환 (ssokolow에 의해 suggested로 한 줄에) 진짜.
해시가 모두 다르므로 모든 엔지니어가이 새 리포지토리에서 다시 복제해야하지만 가동 중지 시간과 전체 기록을 지불하는 데는 적은 비용이 듭니다.

enter image description here

below 의견 Qix로 :

fast-import 그냥 자식 정보를 가져올 것으로 보인다,하지만 아무것도 확인하지 않습니다.
git init은 원래 마스터에 넣습니다. 따라서 fast-import 이후 파일을 실제로 확인하려면 git reset --hard HEAD이 필요합니다.

+0

감사합니다. VonC 덕분에 간단하다고 생각하지 않았습니다. – SilentGhost

+1

그러면'git filter-branch'를 사용하여 이력서를 영구히 가져온 것을 다시 쓸 수는 있지만 역사가 다시 쓰여집니다. –

+0

이식편이 무엇인지 이해하는 데 도움이되는 짧고 청결한 기사 및 그 역사에 참여하는 방법에 대한 단계별 안내 : http://ben.straubnet.net/post/939181602/git-grafting-repositories – skalee

관련 문제