2013-08-16 2 views
4

"merge git repositories"를 사용하여 모든 사람이 다른 것을 이해하므로 여기에 제 경우가 있습니다. 우리는 TFS 저장소를 가지고 있으며, 한 번에 소스를 체크 아웃하고 초기 git commit을 만들었습니다. 그런 다음 git (분기, 병합 등)에서 정상적인 개발을 수행했습니다. 문제는 새로운 저장소에서 git 저장소에 기록이 없으므로이를 수정하려고한다는 것입니다. 따라서 전체 TFS 저장소를 git 저장소로 변환했으며 현재 변환 된 TFS 저장소를 현재 git 저장소와 병합해야합니다.git 저장소에 병력 추가 또는 git 저장소 병합

위의 설명에서 분명해 지듯이 저장소는 git 관점과는 독립적이지만 논리적 인 측면에서 볼 때 공통점이 있습니다 (현재 git 저장소에 처음 커밋 된 커밋).

리포지토리의 병력을 잃지 않고 병합하려면 어떻게해야합니까? 변환 된 TFS 저장소를 기본 저장소로 사용하고 체리가 현재 저장소의 마스터에서 변경 사항을 선택하지만 현재 저장소에서 생성 된 모든 저장소는 가져 오지 않습니다.

답변

2

편집 : 내 이전 대답은 좋은 결과로 이어지지 않습니다. git rebase는 이것을하기위한 것이 아닙니다. 그러나 비슷한 이미 유래에 무슨 일이 있었 : Merging two git repositories to obtain linear history

이 절차를 시도 할 수 있습니다 :

git init combined 
cd combined 
git remote add old url:/to/old 
git remote add new url:/to/new 
git remote update 

당신은 모두의 repos에 대한 참조와 함께, 새로운 REPO있을 것이다.

git reset --hard old/master 

그러면 마스터 분기가 이전 repo의 마스터 분기를 가리 킵니다. 이제 벚꽃은 우리가 있었던있다

git cherry-pick <sha-1 of first commit on new repo>..new/master 

우리가 시작한 새로운 REPO의 마스터 지점에서 모든 커밋을 선택할 수 있습니다 : 마스터 분기 괜찮습니다,하지만 새로운 REPO의 다른 지점에 대해? 글쎄, 당신은 다음, 그래서 더 이상

git remote rm old 

을 기존의 repo 필요하지 않습니다, 당신은 당신의 새로운 저장소에 'BRANCH1'라는 이름의 지점을 가지고 말한다.

git checkout branch1 
git rebase master 

이 그것 (가져온 REPO에서 역사를 포함하는 결합 된 마스터) 마스터에서 시작하게 BRANCH1의 역사를 변경해야하고, 리베이스가 충돌없이 발생한다. 확인 역사는 gitk이 명령과 일치, 당신은 당신이 상류 역사를 변경하기 때문에 역사는, 푸시을 강제하기 전에 확인 있는지 확인해야

git push -f new master 
git push -f new branch1 

으로 밀어 강제 할 수 있습니다 (신규 및 기존의 repos의 백업을 유지 필요한 경우 복구)

+0

"오픈 지사"란 무엇을 의미합니까? 후속 리베이스로 인해 다른 지점의 모든 커밋이 한 지점 (낡은 마스터, 충돌이 없다고 가정)에 겹쳐 쌓이게되지 않을까요? –

+0

아니요, newrepo/master 브랜치는 oldmaster, newrepo/branch1 등에서 시작하도록 리베이스됩니다. 이것은 이전 리포에는 하나의 브랜치 만 있다고 가정합니다. "오픈 브랜치"란 말은 git 리포지토리에서 리베이스 할 마스터와 다른 모든 브랜치를 의미합니다. 최종 결과는 oldmaster의 내용이 새로운 git repo의 각 지점 앞에 추가되어야합니다. 결국 각 rebase 전에 재배치 할 브랜치로 전환해야합니다.(git checkout newrepo/branch1; git rebase oldmaster) – p91paul

+0

newrepo의 모든 브랜치는 처음에 git로 가져온 커밋에서 가져온 것이므로 나중에 다른 브랜치를 많이 만들었더라도 하나의 "오픈 브랜치"만 있다고 가정합니다. 이 출발점이 맞습니까? 하지만 내 oldrepo에는 과거의 안정적인 릴리스에 대한 몇 가지 분기가 포함되어 있는데 어떻게 상황이 바뀌 었습니까? –