镜像SVN子目录中的git子目录

时间:2014-06-27 18:11:39

标签: git svn version-control

是的,我知道这里已经有很多版本控制问题了,但是所提议的解决方案都没有完全符合我的要求而且我无法找到一种方法来解决这些问题。我现在一直在寻找一周。

我的设置:

Windows 7机器(带有cygwin--虽然我没有触及它来解决这个问题),远程密码保护的git repo和svn repo。逐渐从使用svn转换为git用于新项目(之前没有人使用过git)并且需要来回移动代码。

我想要的是什么:

我和其他几个人应该能够在gitproject/path/to/sharedcode中工作,并让我们的提交自动更新svnproject/trunk/path/to/sharedcode。这应该只影响这两个子目录,其余的repos应该保持独立。 我正在寻找从git到Subversion的单向永久链接。历史需要保留在git中,但不能保存在svn中,因为那里不会发生任何开发。此外,我们希望这是可重复的,以便将来我们可以以同样的方式设置anothersvnproject/trunk/path/to/sharedcode作为镜像。

可能的解决方案:

  • 检查gitproject/path/to/sharedcode(运行git diff)中的更改的脚本,如果找到,则复制它们并将它们推送到svn repo。这可以每天自动运行,也可以由进行一些更改的开发人员调用。
  • 我们可以在提交时运行的脚本,例如^ this ^,而不是运行git push gitproject master,将更改推送到git和svn。

或者,如果一切都失败了,

  • 一个非常明确,明显的工作流程,我们所有人都可以轻松地在git中工作。像"首先,使用COMMAND结帐gitproject。然后使用COMMAND创建一个名为NAME的新分支。然后进行更改。然后转到LOCATION并运行COMMAND ..."

我尝试过的事情:

  • SubGit对于我们的目的来说看起来有点过分,而且我不想/无权设置它,因为它不是开源的。我想在不创建新回购的情况下这样做。

  • 使用git-svngitproject/path/to/sharedcode中使用git svn init --trunk=http://svnhost.com/svnproject/trunk/path/to/sharedcode --no-minimize-url创建新的回购。这会创建一个我可以推送的新本地仓库,可能对批处理脚本有用,但它不是理想的解决方案。

  • Git2Svn看起来很有希望,但我找不到任何相关文档,所以我不相信它。

  • 之前我使用过Svn2Git(用红宝石编写的版本)并且效果很好,但我认为它不具备我现在需要的功能。

  • Git-Subversion Bridge看起来非常类似于我们想要的自动同步,但同样,它很复杂,涉及设置一个全新的回购。如果我得到团队其他成员的帮助,我们可能最终会使用它。

  • 我也尝试编写我描述的Windows批处理脚本。它类似于:git pull gitproject的最新版本,在git diffgitproject/sharedcode上运行svnproject/sharedcode,管道输出到txt文件,使用可怕的,糟糕的Windows { {1}}声明如果IF选择除自述文件以外的任何内容,diff ROBOCOPY /MIRgitproject/sharedcodesvnproject/sharedcode的内容,请提供正确的自述文件备份到ROBOCOPYsvnproject/sharedcode所有内容,svn add来自远程仓库,最后是svn checkout。它没有用。

我确信我拥有解决方案的所有部分,但我缺乏将它们整合在一起的知识和编码技能。我希望stackoverflow可以提供帮助。

2 个答案:

答案 0 :(得分:1)

  1. 你不能在Git回购中的部分树上操作(简言之 - 它是整体对象,与SVN相反)
  2. 由于第1页,您必须拆分您的Git存储库并将/path/to/sharedcode转换为其他特殊存储库。您可以使用SubmodulesSubtree方法(时髦的Git-boys更喜欢今天子树)
  3. 使用git-svn使用专用仓库,可以将新远程添加到svnproject/trunk/path/to/sharedcode(Git-history将镜像到SVN,但这是最懒惰和最简单的方式)

答案 1 :(得分:0)

我不同意Lazy Badger's answer。虽然您无法检出git回购的一部分。您可以检出git存储库,并在子树上使用文件系统操作。因此,您可以有两个结帐:svn存储库之一,另一个git存储库。然后,您可以使用脚本(也许使用rsync)来同步适当的子目录。没有理由检查差异。版本控制将为您完成此操作。然后,您可以将更改提交到svn存储库。该脚本可以作为cron作业运行。只要您只需要同步一个分支,此方法就可以使用。

目前我无法找到代码,但是我们有一个大型的git存储库,而另一个团队的svn存储库则使用类似的方法维护子树的只读副本。