背景
- 我们有一个带有发布分支的 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 release
和git-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/