5

上下文

  • 我们有一个带有发布分支的 git 存储库。
  • 我们有一个 TFS 存储库(当前为空)。

我的任务是将 git repo 的发布分支镜像到 TFS 中,以便 git 中的每个提交都映射到 TFS 中的变更集。所有开发人员都只承诺使用 git 并且(假设)不知道 TFS。

阅读rcheckin 的文档以及对这个相关问题的回答让我相信 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 共享存储库中,并在每个提交后重新检查。

    • 这种方法很有效,对于每次提交,TFS 中都有一个变更集。但是,原始提交消息位于“merged c02436de4f..”消息下方。
    • 对每个变更集都进行处理是不现实的,即使使用脚本也是如此。
    • 正如patthoyts所指出的,就 TFS 而言,这将使我成为该更改的提交者。

我的问题

我需要做些什么来使 TFS 与 git-repo 的发布分支保持最新,以便 git 中的每个提交都有相应的 TFS 变更集?

附加信息

我确实对这两个 repos 有管理控制权,如果有必要,我可以重新设置 git repo 的基础,这意味着所有后果。我只是不想失去我们已经创造的历史。

4

2 回答 2

3

我认为您所看到的是 git-tfs 仅使用 HEAD 和 tfs/default 之间最短路径的提交。TFS 的历史是一个变化列表,而 git 是一个图表,你遇到了两者之间的阻抗不匹配。要了解 git-tfs 所看到的内容,git log --graph --oneline --decorate HEAD tfs/default请在使用 rcheckin 之前尝试。

如果你想要 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 文档以获取更多关于 rebase 可以做的事情的示例。

不要git push github about-to-be-rewritten-twice:release

于 2013-02-21T22:08:21.017 回答
1

我不认为这会很好。如果您确实修复了提交,则每个提交都将具有您向 TFS 提交的那一刻的时间戳和用户 ID。将这些提交到 TFS 时,您无法保留原始作者或时间。微软已经宣布 TFS 将在未来支持 Git,你可能最好等待。所以不久之后,任何需要使用 tfs 的人都可以升级他们的工具并访问您真正的 git 存储库。

我怀疑您的合并进行了合并提交,这导致了壁球。您可以尝试将 git-tfs 分支重置为您的 git master,然后推送提交。我们在共享存储库是 TFS 的地方使用 git-tfs 的另一种方式,我们都使用 git 和 git tfs 进行提交。如果我创建一个分支并添加一些提交,那么git tfs rcheckin不会将它们压缩成一个,而是会创建一个与我在本地 git 中的内容相匹配的系列。我确实发现使用“阶段”然后在 tfs 中取消暂存以进行提交会将所有内容压缩为一个。您没有说为什么必须镜像到 TFS,但我建议您尝试将他们指向最近的 microsoft 公告并告诉他们 git 是未来!即使使用 TFS。:)

于 2013-02-21T15:53:58.987 回答