首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步TFS和GIT

同步TFS和GIT
EN

Stack Overflow用户
提问于 2013-11-21 09:54:40
回答 2查看 10.3K关注 0票数 20

今天,我们在本地TFS服务器上有了所有的源代码。现在,我们希望某些外部方能够访问代码的一部分。因此,我们研究了这样一种可能性,即将此代码克隆到他们可以访问的外部GIT服务器上。

我看过git-tfs了。但是,如果我正确理解,您必须在GIT和TFS发生任何更改时手动同步它们。是否有一种方法可以自动同步代码的克隆。

如果TFS有更改,则自动同步到GIT,反之亦然。如果我使用最新的代码,就不会有任何不确定性。

EN

回答 2

Stack Overflow用户

发布于 2013-11-22 10:34:13

无论您选择哪种解决方案,都不可能单独地100%自动同步2个存储库(要实现自动同步,必须在任何时间内实现同步,或者在两个团队之一开始同步时阻止推送git或签入TFVC )。

因此,您将始终有冲突,您应该合并手动。您可以找到一个工作流,它可以阻止大多数案例,但永远不会解决所有的问题,而剩下的这些案例将非常难以解决……

无论如何,你几乎可以得到你想要的东西(这取决于你的期望:你需要分支支持吗?困难-……)对于git(我已经包含在git中,所有这些都需要这样做,但从未在生产中使用过),但这有点棘手。

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

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

然后,您需要在这个post-receive库的bare钩子中编写类似这样的东西(我不记得它是否有效):

代码语言:javascript
复制
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服务器与计划的任务同步(这样他们就会更早地意识到新的提交):

代码语言:javascript
复制
git tfs fetch --all

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

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

其他的事情可能很难或者不可能做.

我希望这会有所帮助。

PS:

  • 这是一项艰苦的工作,你正试图为一个不习惯的人-tfs.和一些我不建议做的事。
  • 我强烈建议微软采取同样的方式,在git上迁移所有的东西(如果需要的话,即使停留在TFS服务器或VSTS上),这样的同步会容易得多(即使不是100%自动的;-)。我做了一个很好的关于如何从TFVC:git.md迁移的文档。
  • 试着说服你的企业,每个团队都应该选择和掌握自己的工具,而不是强加给他们一些选择。
票数 12
EN

Stack Overflow用户

发布于 2017-12-18 18:43:43

自提出这一问题(2013年Q4版)以来的主要变化是,2015/2017年TFS现在得到了对Git存储库的官方支持。见"Git和TFS“。

因此,一个合理的办法是:

  • 使用像git-tfs这样的工具将现有的TFS项目历史导出到一个新的Git存储库中。
  • 将Git回购分成一个主代码库和几个较小的repos,每个repos表示您希望其他贡献者访问的部分。
  • 引用主代码库中的那些子模
  • 最后,创建TFS项目(这次使用Git repos),以便将这些回复推回TFS服务器。

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

在任何时候;从主要的coderepo回购,您可以用以下方式更新这些子模块

代码语言:javascript
复制
git submodule update --recursive --remote --rebase

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

此外,考虑到l--''''''---------''''''''''''前一个问题,这将有助于单次回购有太多的文件。

虽然,对此,不久将有(Ish) GVFS

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

我个人想要在我自己的变更中使用GIT,我会在GIT中有多个变更集,然后将它们合并为一个,然后将那个变更集转换成一个传统的TFS变更集,并签入,这样我就有一个签入每个TFS项。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20117574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档