同步TFS和GIT

时间:2013-11-21 09:54:41

标签: git tfs git-tfs tfs2013

今天我们在本地TFS服务器上拥有所有源代码。现在我们希望一些外部方可以访问部分代码。因此,我们考虑的可能性是将此代码克隆到他们可以访问的外部GIT服务器。

我查看了git-tfs。但是如果我理解正确的话,当它们发生任何变化时,你必须手动同步GIT和TFS。有没有办法克隆自动同步的代码。

如果TFS有变化,它会自动同步到GIT,反之亦然。如果我使用最新代码

,应该没有不确定性

2 个答案:

答案 0 :(得分:10)

没有办法同步2个存储库100%自动地与您选择的任何解决方案同步发展(为了实现自动同步,您必须立即实现同步或者能够阻止推入git或在TFVC中检入时其中一个团队开始同步)。

因此,您将始终存在冲突,您应该手动合并。您可以找到一个工作流程来阻止其中的大多数但从未解决所有案例,这些剩余的案例将很难解决......

无论如何,你几乎可以实现你想要的东西(这取决于你的期望:你需要分支支持 - 硬 - ,......)和git-tfs(我已经包含在git-tfs中了所有需要做的事情)那但从未在生产中使用过)但这有点棘手。

您需要在bare存储库中克隆您的TFS存储库:

git tfs clone https://server/tfs/TeamCollection $/project/trunk --bare --with-branches

那么你需要在这个post-receive存储库的bare钩子中写一些类似的东西(我不记得它是否有效):

branch=$(git rev-parse --symbolic --abbrev-ref $1)
if [ "master" == "$branch" ]; then
    branch="default" 
fi
git tfs rcheckin --bare -i $branch

有了这个,每次有人推入git存储库时,都会在TFS中签入提交。

为了更加舒适(否则他们在尝试推送时总会遇到无聊的冲突),您可以将git存储库与TFS服务器同步,并使用命令执行计划任务(这样他们就会更快地了解新的提交) :

git tfs fetch --all

注意:我不记得是否可以在bare存储库中使用此命令(现在我想到了,我不这么认为)。否则,您必须为每个现有分支使用git tfs fetch -b=myGitBranch -i tfsRemote :(

但我确信他们永远无法使用尚未在tfs中创建的分支:( git-tfs工具确实无法从git历史记录中自动创建TFVC分支。技术上,这是可以实现的我认为,但从未开发过(因为git-tfs更像是逃避TFVC的工具,而不是检查你的开发工具......)

其他一些东西可能很难或不可能......

我希望它会有所帮助。

PS:

  • 对于那些不习惯git-tfs的人来说,这是一项艰苦的工作...而且我不建议这样做。
  • 我强烈建议采用与Microsoft相同的方式,并在git上迁移所有内容(如果需要,甚至停留在TFS服务器或VSTS上),这样同步将更容易(即使不是100%自动; - ))。我已经就如何从TFVC迁移了一个很好的文档:https://github.com/git-tfs/git-tfs/blob/master/doc/usecases/migrate_tfs_to_git.md
  • 尝试说服您的企业,每个团队都应该选择并掌握其工具,而不是强加一些选择。

答案 1 :(得分:3)

自问该问题以来(2013年第4季度),主要的变化是TFS 2015/2017现在对Git存储库有官方支持。请参阅" Git and TFS"。

所以合理的方法是:

  • 使用git-tfs之类的工具将现有的TFS项目历史记录导出到新的Git存储库中。
  • 将Git repo拆分为一个主代码库,以及几个较小的repos,每个代表您希望其他贡献者访问的部分
  • 引用主代码库中的sub-repos as submodules
  • 最后,创建TFS项目(这次使用Git repos),以便将这些存储库推回到TFS服务器。

这将为您留下一系列TFS项目,每个项目都可以向特定团队开放,确保其他贡献者只能看到/访问特定部分。

随时;从主要的代码回购,你可以update those submodules with

git submodule update --recursive --remote --rebase

(然后测试,添加,提交和推送:您的主要Git仓库将引用这些子模块的最新发展)

另外,考虑到l--''''''---------''''''''''''' previous question,这对于包含太多文件的单个仓库有帮助。
虽然如此,there will be soon(ish) GVFS

l--''''''---------''''''''''''提到的替代方法是:

  

我个人希望能够使用GIT进行自己的更改,我愿意   在GIT中有多个变更集,然后我将它们合并为一个,和   然后将该变更集转换为传统的TFS变更集并进行检查   在那个方面,我每个TFS项目只有1个签到

如果您不介意丢失中间Git提交历史记录,那么您可以将它们集中到一个TFS变更集中,这是可能的。