同步TFS和GIT

问题描述 投票:17回答:2

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

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

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

git tfs git-tfs tfs2013
2个回答
10
投票

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

所以,你总是会有冲突,你应该手动合并。您可以找到一个工作流程来阻止其中大部分工作但从未解决所有案例,这些剩余的案例将很难解决......

无论如何,你几乎可以实现你想要的东西(这取决于你的期望:你需要分支支持 - 硬 - ,...)与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
  • 试着说服你的企业,每个团队都应该选择并掌握其工具,而不是强加一些选择。

3
投票

自从提出这个问题以来(2013年第四季度),主要的变化是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变更集中时。

© www.soinside.com 2019 - 2024. All rights reserved.