结合SVN和Git

Saw*_*ant 4 svn git

我只是想到了这个古怪(愚蠢?)的想法,我想在同一时间用Git和Subversion跟踪同一个文件夹(项目); 这是文件夹/项目将有两个.svn.git目录.

我没有在我的搜索中找到任何相关信息,所以这就是为什么我在这里抛出这个想法来评估它的优缺点(如果有的话).我可能正在寻找的是:为什么不能或不应该使用这种策略?

问:为什么我要这样做?

我们已经在网络上有一个Subversion repo,有超过1年的历史记录+ svn:externals +链接到bug跟踪+钩子.但我希望拥有DVCS的灵活性,例如Git,这样我们就不必连接到网络来承诺我们的工作; 这样我们也可以远程工作.

问:但我可以使用git svn!

不幸的是,Git svn不支持svn:externals.并且git子模块与svn:externals不同.

问:这种组合可以实现什么?

Git的灵活性:可以在不连接网络的情况下在本地编辑和提交代码; 此外,将回购推广到生产或升级服务器或同事将是一块蛋糕.

SVN的集中化和外部回购利用:有效利用SVN:外部,我们将节省大量的工作,然后开发人员已经熟悉SVN.

理想情况下,我想最终完全切换到Git,但是现在,因为svn:externals使得集成外部回购非常容易,保持颠覆完整是有道理的.

me_*_*and 5

这个策略绝对有用; 我已经习惯了,虽然相当简短,我知道我公司的其他开发人员已经使用了更长时间.然而,这并不意味着它很容易.

您会发现需要做很多工作才能使Subversion和Git保持同步.举个简单的例子:当你这样做时svn update,你也需要做一个git commit -a或者类似的事情,否则Git会认为你的工作副本有一大堆变化,Subversion知道它们与远程存储库是最新的.

如果您svn update -r出于某种原因需要查看旧版本,或尝试使用svn switch等,这会变得更加复杂.

根据您是否有Git跟踪您的.svn目录,您将遇到其他问题.如果你不这样做(即你.svn输入你的.gitignore文件或类似文件),你会发现使用Git的分支功能要困难得多.请考虑以下工作流程:

  1. 创建一个Git分支来处理一个功能.
  2. 您需要修复Subversion存储库中最近检入的错误!切换回你的主要的Git分支,svn up并且git commit,让你拥有最新的代码,修正错误,git commit并且svn commit它.
  3. 再次检查您的Git功能分支.由于这是基于不同的Subversion修订版,Subversion现在认为工作副本中有大量的更改.

或者,您可以让Git跟踪.svn目录.这避免了上述问题 - 当您在步骤3再次检出功能分支时,您还要检查此时的Subversion元数据,因此Subversion知道所有内容都基于的正确修订.

可悲的是,Subversion从未被设计成以这种方式使用.在Subversion 1.6(我不知道1.7)中,.svn目录可能包含重要的空文件夹.Git不跟踪空文件夹,因此这些可能会在Git操作之间丢失,从而破坏Subversion工作副本.我知道有一个开发人员编写了一堆脚本来修复这些错误的.svn目录,但这并不简单,而且非常脆弱.