同步TFS和GIT

Sync TFS and GIT

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

我看过git-tfs。但是,如果我理解正确,那么当它们发生任何更改时,您必须手动同步GIT和TFS。有没有办法克隆自动同步的代码。

如果TFS中有更改,它将自动同步到GIT,反之亦然。如果我使用最新的代码,应该没有不确定性。


无法使用您选择的任何解决方案自动同步2个分别自动进行100%演化的存储库(要实现自动同步,您必须立即实现同步,或者必须阻止git推送或在TFVC中签入, 2个团队之一开始同步)。

因此,您始终会有冲突,应该手动合并。您可能会找到一个可以阻止大多数情况的工作流程,但永远无法解决所有情况,而剩下的情况将真的很难解决...

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

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

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

然后,您需要在该bare存储库的post-receive挂钩中编写类似的内容(我不记得它是否有效):

1
2
3
4
5
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服务器与带有计划任务的命令同步(这样,他们将更快地意识到新的提交) :

1
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
  • 尝试说服您的企业,每个团队都应该选择并掌握其工具,而不应施加某些选择。


自从提出此问题(2013年第四季度)以来,主要变化是TFS 2015/2017现在对Git存储库具有官方支持。请参见" Git和TFS"。

因此,合理的方法是:

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

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

在任何时候;从主代码仓库中,您可以使用以下命令更新这些子模块:

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

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

此外,考虑到l--''''''---------''''''''''''的上一个问题,这将有助于单个回购中包含过多文件。
尽管为此,不久将有GVFS。

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

I personally want to be able to use GIT for my own changes, I would
have multiple changesets in GIT, then I would merge them into one, and
then convert that changeset into a traditional TFS changeset and check
that in, that way I just have 1 check-in per TFS item

这是可能的,只要您不介意丢失中间的Git提交历史记录,那么当您将它们汇总到一个TFS变更集中时即可。