2013-08-01 3 views
1

현재 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를 다시 작성 필터 지점을 시도 할 거라고. 그게 최선의 선택입니까?

("이 권리를 얻으려는 이유"는 비슷한 방식으로 사용하도록 부서의 다른 사람들을위한 반복 가능한 요리법이나 스크립트를 게시하고자하는 것입니다).

+0

좋아요. 그래서 ... 무슨 일이 벌어지고있는지를 그래픽으로보고 나면 말이되는 것 같습니다. 하위 트리를 가져 왔지만 공통 조상이 없습니다. 만약 내가 돌아가서 초기 "oldtfs"커밋에서 분기를 만들면 나는 그것이 효과가있을 것이라고 생각한다. 그것이 2 일 안에 나 자신에게 대답 할 것이라고 가정하면 ... –

+0

이것은 실제로 공통 조상의 결핍과 관련이없는 것처럼 보입니다. 아래 답변을 참조하십시오. –

답변

0

그래서 마지막으로 필터 브랜치 명령을 사용했습니다. "사전 재 작성된"기록을 어느 곳 으로든 밀지 않을 것이므로 미래의 병합에 문제를 일으키지 않을 것입니다. 이는 TFS Git보기뿐만 아니라 다른 그래픽 기록 도구 (TortoiseGit 등)가 가져온 폴더의 하위 디렉토리에서 이전 전체 내역을 표시하는 유일한 방법이었습니다. 내가 대신 --tree 필터--index 필터 하위 명령을 사용할 수 있기 때문에 생각했던대로

그것은으로 지저분하지 않았다. 맨 페이지에는 어떻게하는지에 대한 예가 있습니다 :

git filter-branch --index-filter \ 
    'git ls-files -s | sed "s-\t\"*-&MyProject/MyDir/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD