14

我正在评估使我们的团队远离 CVS 的各种选择。我们在另一个站点上有另一个使用 Subversion 的大型团队,我们的一些开发人员使用 Subversion 服务器。因此,Subversion 对我们的团队来说是一个显而易见的选择。然而:

  1. 涉及 Subversion 服务器的操作可能会很慢(尽管我们在站点之间有良好的连接)。
  2. 我们中的许多人都接受了分布式版本控制的想法,并广泛使用 Mercurial 或 git(然后合并并提交到 CVS 并从

git-svn看起来很有趣,但我想知道的是,由于在 Subversion 中拥有少数集中式分支,DVCS (如 git)的功能有多少会丢失。特别是,我仍然希望能够保留 Mercurial 的工作流程,例如:

  1. 我们可以拉取其他团队成员的存储库并合并,从而在特性分支进入我们在 Subversion 上的主要稳定主干之前就特性分支进行协作吗?
  2. 我们是否可以期望 git 可能产生的大量诡计通常会起作用,或者我们是否需要小心避免混淆 git-svn?
  3. 我们是否可以使用 git 来加快从 Subversion 的签出速度,方法是将其从另一个站点拉过连接一次,然后将其拉入单独的存储库一次。
  4. 如果有人提交了 Subversion,我们可以安排其他 git 用户通过 git-svn 仍然看到完整的开发历史吗?
  5. 尽管 Subversion 服务器有半个世界的延迟,我们是否可以基本上避免在 Subversion 服务器上等待交互操作?

我们中的许多人已经习惯了一个主要的相当稳定的共享分支的想法,它具有一个简单的线性历史,每个人都可以推送到它,因此它们会定期合并到尖端。我不清楚如何使用 git(或 Mercurial 或 Bazaar)很好地支持此工作流程。

4

3 回答 3

2

你确实失去了很多,感觉像是二等的,但你确实获得了所有精彩的分支东西。

我通过使用它来处理一个托管在颠覆中的项目来学习 git。git 允许我进行所有本地开发并在项目上取得相当大的进展,同时仍然跟踪主流分支,甚至与他人分享我的工作。

最后,我们最终将整个项目推到了 git 上,因为在进行 subversion 时丢失了所有信息。

你会失去什么:

  1. 合并跟踪 - 有点。
  2. 正确记录更改的作者身份。

我说“有点”WRT #1,因为如果你把一棵树放在一起,它会跟踪你用 git 做的合并和东西并应用于颠覆,但是一旦你尝试克隆那个 repo,或者其他人做了一个 git -svn clone,你失去了它并且合并再次变得非常痛苦。

作者身份对我来说很重要,因为我发现确保人们因其所做的工作而获得赞誉非常重要。

于 2009-02-12T19:51:44.793 回答
2

正如已经提到的,与Git 体验git-svn相比有一定的局限性:

  1. 团队协作很艰难:

    如果一位开发人员使用 将更改推送到 SVN 存储库git-svn,另一位开发人员获取的更改略有不同;获取的提交被转换了两次——从 Git 到 SVN,从 SVN 回到 Git。因此,很难以分布式方式进行协作。

  2. 丢失的元数据:

    .gitignore 和 .gitattributes 文件在git-svn向 SVN 发送更改时会丢失,也就是说,git-svn不会将该元数据转换为相应的 Subversion 属性。其他开发人员在获取时不会收到元数据更改。

  3. 丢失的合并跟踪数据:

    如果一个合并两个分支,git然后用 推送合并提交git-svn,Subversion 存储库不会自动获取任何关于合并历史的数据。

  4. 弱分支支持:

    必须在 Subversion 存储库中创建一个分支,使用它获取它,git-svn然后才将更改提交到该分支。如果创建一个常规 Git 分支并尝试将其推送回 SVN 存储库,git-svn则不会创建新分支,而是将提交发送到现有分支。

SubGit是具有git-svn以下功能的替代品:

  • SubGit 作为一组钩子在服务器端工作,它同步 SVN 和 Git 存储库,保持双方可写;

  • 可以使用任何 Git 客户端来使用支持 SubGit 的 Git 存储库;支持任何 Git 工作流程;

  • SubGit 修复了git-svn上面列出的所有问题。

SubGit 是一款具有许多免费选项的商业软件。有关更多信息,请参阅文档与 git-svn 进行比较

免责声明:我是 SubGit 开发人员之一。

于 2013-02-20T20:38:55.583 回答
1

对于我所看到的,您可以在存储库检索与 git-svn 之间使用 git(这样您就可以拥有一个 git 公共存储库,这将是您正在谈论的 svn 存储库的“镜像”,但 git 存储库可能是托管在您的站点中)。

因此 git 用户的 checkout/clone/push/pull 会很快。然后我想你可以在你的 git repo 中添加钩子以通过 git-svn 与 svn repo 同步,但是你必须处理冲突,直到你使用不同的分支。

我们在这里所做的是,每个开发人员都有一个带有他的名字的分支,并且他必须在管理员将他的分支与主分支合并之前与主分支合并(所以他正在处理冲突),没有任何冲突,因为开发人员已经处理了它.

希望这有帮助。

于 2009-02-12T11:04:36.823 回答