我的任务是将git repo的发布分支镜像到TFS,以便git中的每个提交映射到TFS中的变更集。所有开发人员只提交git并且(假设)不知道TFS。
阅读documentation for rcheckin以及此related issue的答案让我相信rcheckin能够做到这一点。
git中的所有提交都被压缩成一个变更集。
繁殖顺序:
git tfs clone http://tfs:8080 $/tfsrepo
cd tfsrepo
git remote add github git@github.com:REPO/Repo.git
git fetch github
git merge github/release
git tfs rcheckin
这导致单个签入TFS,其中包含所有提交。
克隆后,合并来自源(git)repo的第一个提交,rcheckin以创建共享库
git pull github release
后跟git-tfs rcheckin
导致再次进行压缩。 对于原始仓库中的前几次提交,我将它们逐个合并到git-tfs共享仓库中并在每个仓库之后进行rcheckin。
我需要做些什么来保持TFS与git-repo的发布分支保持同步,以便git中的每个提交都有相应的TFS变更集?
我确实对两个repos都有行政控制权,如果有必要,我可以重新设置git repo,这意味着所有后果。我只是不想失去我们已经创造的历史。
答案 0 :(得分:2)
我认为你所看到的是git-tfs只使用HEAD和tfs / default之间最短路径的提交。 TFS的历史是一个变化列表,而git是一个图表,你正在达到两者之间的阻抗不匹配。要了解git-tfs看到的内容,请在使用rcheckin之前尝试git log --graph --oneline --decorate HEAD tfs/default
。
如果你想要1:1 :: commit:changeset的话,试试这个:
git tfs clone http://tfs:8080 $/tfsrepo
cd tfsrepo
git remote add github git@github.com:REPO/Repo.git
git fetch github
git tfs rcheckin github/release
另一种方法是使用cherry-pick或rebase。
git tfs clone http://tfs:8080 $/tfsrepo
cd tfsrepo
git remote add github git@github.com:REPO/Repo.git
git fetch github
git checkout -b about-to-be-rewritten-twice github/release
git rebase tfs/default
git tfs rcheckin
查看rebase docs了解更多关于rebase可以做的事情的例子。
不要git push github about-to-be-rewritten-twice:release
。
答案 1 :(得分:1)
我认为这不会很好。如果您确实修改了提交,那么每个提交都将具有您投入TFS时的时间戳和用户ID。将这些内容与TFS一起使用时,您无法保留原始作者或时间。你可能会等待更好,因为微软已经宣布TFS将来会支持Git。因此,不久之后,任何需要使用tfs的人都可以升级他们的工具并访问真正的git存储库。
我怀疑你的合并进行了合并提交,这导致了壁球。您可以尝试将git-tfs分支重置为您的git master,然后再推送提交。我们以共享存储库为TFS的方式使用git-tfs,并且我们都使用git和git tfs进行提交。如果我创建一个分支并添加一些提交,那么git tfs rcheckin
不会将这些提交为一个,而是使我的本地git中的系列匹配。我确实发现使用'stage'然后在tfs中取消暂存以使提交压缩为一个。你没有说为什么你必须镜像到TFS,但我建议你尝试在最近的微软公告中指出它们并告诉他们git是未来!即使有TFS。 :)