git - 使用 git-tfs rcheckin 将 git 提交到 TFS 变更集的一对一映射

标签 git version-control tfs git-tfs

背景

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

我的任务是将 git 存储库的发布分支镜像到 TFS 中,以便 git 中的每个提交都映射到 TFS 中的变更集。所有开发人员只 promise 使用 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

这会导致一次 checkin 包含所有提交的 TFS。

解决问题的其他尝试

  • 克隆后, merge 来自源 (git) 存储库的第一个提交,rcheckin 以创建共享基础

    • 这行得通,但随后的 git pull github releasegit-tfs rcheckin 导致再次提交压缩。
  • 对于原始存储库中的前几个提交,我将它们一个接一个地 merge 到 git-tfs 共享存储库中,并在每次提交后重新检查。

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

我的问题

我必须做什么才能使 TFS 与 git-repo 的发布分支保持同步,以便 git 中的每个提交都有相应的 TFS 变更集?

附加信息

我确实拥有对这两个存储库的管理控制权,如果有必要,我将能够对 git 存储库进行 rebase ,这意味着所有后果。我只是不想失去我们已经创造的历史。

最佳答案

我认为您看到的是 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

关于git - 使用 git-tfs rcheckin 将 git 提交到 TFS 变更集的一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005647/

相关文章:

tfs - VS 2013 发布管理 - 路径中存在非法字符

git - 错误计数 git 提交

Git: stash/删除永远不会被版本化的文件

git 忽略除一个扩展名和文件夹结构之外的所有文件

coding-style - 我应该进行外观更改吗?

version-control - 如何在emacs的边缘添加差异标记?

tfs - 共享资源范围获取锁失败

windows - 将 git log 的输出分配给 powershell 变量

git - 颠覆和 GIT 集中化

c# - TFVC checkin 最佳实践