현재 TFS를 사용하고 있지만 TFS 2013에 내장 된 Git 지원이 필요합니다. 나는 TFS에서 기존의 모든 지사를 Git의 다른 하위 폴더로 끌어 들이고 싶습니다. (예, 각각에 대해 별도의 Git 저장소를 만드는 것이 더 좋을 것입니다. 그러나 "이유 때문에"나는 할 수 없습니다. 그냥 아직).전체 히스토리 (스쿼시 없음)로 하위 트리에 기존 Git Repo를 가져옴
그래서 git-tfs를 사용하여 TFS 기록을 새로운 repo로 복제했습니다. Git 변경 사항은 TFS에 적용되지 않으므로 아무런 문제가 없습니다.
git tfs init http://ExistingTfs:8080/tfs/DefaultCollection $/Path/To/Branch oldtfs
git tfs fetch
나는 다음 로컬 새의 repo를 복제하고 원격으로
oldtfs에게을 추가했다.
git clone http://NewTfs:8080/tfs/DefaultCollection/_git/NewRepo newtfs
git remote add oldtfs ../oldtfs
다음 I 먼저 newtfs 로컬 노력으로 oldtfs에서 커밋 당기기 subtree merge 사용하여 시도.
git merge -s ours --no-commit oldtfs/master
git read-tree --prefix=MyProject/MyDir/ -u oldtfs/master
git commit -m 'import old TFS'
잘 작동하는 것 같았다 ("자식 로그는"바로 이곳의 모든 역사를 보여 주었다)하지만 난 TFS까지 밀려 때 두 부모를 했더라도, 그것은, 커밋과 같은 단일 병합 등장 기대했던대로. 조금 더 읽고 나면, 필자가 필요로하는 것이 rebase처럼 들렸다.
그래서 나는 newtfs, 수입 및 스쿼시 두 가지를 만들었습니다. 하위 트리 병합을 에서 수행하고을 입력 한 다음 스쿼시으로 리베이스했습니다.git checkout import
[...subtree merge as above...]
git rebase squash
이의 결과는, 그러나, 수입 이제 모든 원본 TFS는 루트 (안/MyProject를/MYDIR)에 커밋 있으며, 스쿼시가 영향을받지 않는 것으로 보인다는 것이다.
다음으로, 나는 로컬 멋져 보였어하지만 모든 것이 하나 개의 하위 트리에 숙청 보였다 다시 TFS 서버에 밀어, 다시
git subtree add -P MyProject/MyDir
(원격 TFS에서 신선한 복제에) 새로운 "git subtree" script from contrib를 사용하여 시도 (커밋 그러나 다시 여러 부모와 함께).
마지막으로 일반적인 ancenstor가있는 두 번째 분기로 리베이스 (rebase)하여 git 하위 트리를 시도했습니다. 이전과 같은 문제 : 내 커밋 된 커밋은 더 이상 하위 디렉토리에 없습니다.
리베이스의 잘못된 이해가 잘못 되었습니까? 아니면 하위 트리 병합과 하위 트리 스크립트가 호환되지 않습니다.
내 옆에 접근 가져 오거나 (다시, oldtfs는 그것이 가져 오는 그 목적을 제공 한 후 업로드/공유되지 않습니다) 리베이스 전에 oldtfs를 다시 작성 필터 지점을 시도 할 거라고. 그게 최선의 선택입니까?
("이 권리를 얻으려는 이유"는 비슷한 방식으로 사용하도록 부서의 다른 사람들을위한 반복 가능한 요리법이나 스크립트를 게시하고자하는 것입니다).
좋아요. 그래서 ... 무슨 일이 벌어지고있는지를 그래픽으로보고 나면 말이되는 것 같습니다. 하위 트리를 가져 왔지만 공통 조상이 없습니다. 만약 내가 돌아가서 초기 "oldtfs"커밋에서 분기를 만들면 나는 그것이 효과가있을 것이라고 생각한다. 그것이 2 일 안에 나 자신에게 대답 할 것이라고 가정하면 ... –
이것은 실제로 공통 조상의 결핍과 관련이없는 것처럼 보입니다. 아래 답변을 참조하십시오. –