나는 접선으로 관련된 두 개의 git 저장소가 있습니다. 즉, 하나의 콘텐츠는 다른 콘텐츠의 전신이었습니다. 나는 어쨌든 보관소 A의 전체 역사를 보관함 B에두고 싶습니다. 그래서 A의 끝은 저장소 B의 첫 번째 변경 집합의 부모가 될 수 있습니까? 양쪽 모두의 역사는 꽤 직선적입니다.두 개의 git 이력을 연결하는 방법은 무엇입니까?
이것이 가능합니까?
나는 접선으로 관련된 두 개의 git 저장소가 있습니다. 즉, 하나의 콘텐츠는 다른 콘텐츠의 전신이었습니다. 나는 어쨌든 보관소 A의 전체 역사를 보관함 B에두고 싶습니다. 그래서 A의 끝은 저장소 B의 첫 번째 변경 집합의 부모가 될 수 있습니까? 양쪽 모두의 역사는 꽤 직선적입니다.두 개의 git 이력을 연결하는 방법은 무엇입니까?
이것이 가능합니까?
당신은 당신이
도 참조 "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"에 대한
지금 우리가하고 싶은 것은 먼저 부모는 마지막으로 "오래된"의 repo에 커밋되도록 "nuevo
"REPO ("New commit #1
")에 커밋 변경 ("# 3 올드")입니다. 일부 부두에 대한 시간 : 힘내이 환매 특약은 그와 관련 여부, 다른 자식 저장소에서 가져올 수 있습니다
git fetch ../old master:ancient_history
! 훌륭한! 이것은이 우리를 잎 : 우리가 ancient_history에 이전 마스터 브랜치의 이름을 변경
참고 방법에 대해 설명합니다. 우리가하지 않았다면, 자식은 두 개를 합치려고 했었을 것이고 아마도 혐오 스러움에서 포기했을 것입니다.
이제 우리는 여전히 문제가 있습니다.
두 나무가 연결되어 있지 않으며 실제로 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 결과를 복제
:
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
below 의견 Qix로 :이 효율적으로 우리의 "가짜"역사 링크로 변환 (ssokolow에 의해 suggested로 한 줄에) 진짜.
해시가 모두 다르므로 모든 엔지니어가이 새 리포지토리에서 다시 복제해야하지만 가동 중지 시간과 전체 기록을 지불하는 데는 적은 비용이 듭니다.
fast-import
그냥 자식 정보를 가져올 것으로 보인다,하지만 아무것도 확인하지 않습니다.
git init
은 원래 마스터에 넣습니다. 따라서fast-import
이후 파일을 실제로 확인하려면git reset --hard HEAD
이 필요합니다.
감사합니다. VonC 덕분에 간단하다고 생각하지 않았습니다. – SilentGhost
그러면'git filter-branch'를 사용하여 이력서를 영구히 가져온 것을 다시 쓸 수는 있지만 역사가 다시 쓰여집니다. –
이식편이 무엇인지 이해하는 데 도움이되는 짧고 청결한 기사 및 그 역사에 참여하는 방법에 대한 단계별 안내 : http://ben.straubnet.net/post/939181602/git-grafting-repositories – skalee