20

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

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

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

4

2 回答 2

12

无法使用您选择的任何解决方案同步 100% 自动独立发展的 2 个存储库(要实现自动同步,您必须立即实现同步,或者能够阻止 git 中的推送或签入 TFVC 中的一个2队开始同步)。

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

无论如何,您几乎可以使用 git-tfs 实现您想要的(这取决于您的期望:您是否需要分支支持 --hard--,...)用于生产)但它有点棘手。

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

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
  • 尝试说服您的企业,每个团队都应该选择并掌握其工具,而不是被强加于某些选择。
于 2013-11-22T10:34:13.043 回答
4

自提出该问题以来(2013 年第四季度)的主要变化是 TFS 2015/2017 现在正式支持 Git 存储库。请参阅“ Git 和 TFS ”。

所以一个合理的方法是:

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

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

并且随时;从主 coderepo 存储库中,您可以使用以下命令更新这些子模块

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

(然后测试、添加、提交和推送:您的主 Git 存储库将参考这些子模块的最新发展)

另外,考虑到l--''''''---------'''''''''''''s previous question,这将有助于处理包含太多文件的单个 repo。
虽然,为此,很快就会有(ish) GVFS


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

我个人希望能够将 GIT 用于我自己的更改,我将在 GIT 中有多个变更集,然后我会将它们合并为一个,然后将该变更集转换为传统的 TFS 变更集并签入,这样我就有了每个 TFS 项目 1 次签到

这是可能的,前提是您不介意丢失中间 Git 提交历史,然后将它们聚合到一个 TFS 变更集中。

于 2017-12-18T18:43:43.380 回答