在SVN的子目录中镜像一个git子目录

3

我知道这里已经有很多版本控制的问题,但是没有一个提出的解决方案完全符合我的要求,我也找不到一种方法来把它们拼凑在一起。我已经寻找了一个星期。

我的设置:

Windows 7机器(带cygwin——虽然我没有为这个问题动手),远程受密码保护的git repo和svn repo。逐渐从使用svn转向使用git进行新项目(没有人使用过git),需要来回移动代码。

我的需求:

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

可能的解决方案:

  • 检查gitproject/path/to/sharedcode中的更改(运行git diff)的脚本,并且如果发现任何更改,则将它们复制并推送到svn repo。这可以每天自动运行,也可以由进行了一些更改的开发人员调用。
  • 像^这样^的脚本,我们可以在提交时运行它,而不是运行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(用 Ruby 写的)非常好用,但我不认为它具备我现在需要的功能。

  • Git-Subversion Bridge 看起来非常符合我们的需求,具有自动同步功能,但它也很复杂,需要设置一个全新的仓库。如果得到团队其他成员的帮助,我们可能会使用这个。

  • 我还尝试编写描述的 Windows 批处理脚本。大致如下:git pull 获取 gitproject 的最新版本,在 gitproject/sharedcodesvnproject/sharedcode 上运行 git diff,将输出重定向到 txt 文件中,使用可怕的 Windows IF 语句,如果 diff 检测到除 README 以外的任何更改,就将 gitproject/sharedcode 的内容使用 ROBOCOPY /MIR 命令复制到 svnproject/sharedcode 中,从备份中恢复正确的 README 到 svnproject/sharedcode,执行 svn add,在远程仓库上执行 svn checkout,然后最后执行 svn commit。但是它没有成功。

我相信我已经拥有了解决方案的所有部分,但我缺乏知识和编程技能来将它们整合在一起。我希望 stackoverflow 可以帮助我。

2个回答

1
  1. 你不能在Git仓库中操作树的一部分(简而言之,它是一个整体对象,与SVN相反)。
  2. 由于第1点,你必须将Git仓库拆分并将/path/to/sharedcode转换为另一个特殊的仓库。你可以使用SubmodulesSubtree方法(时髦的Git小伙子们更喜欢今天的Subtree)。
  3. 有了专门的仓库,你可以使用git-svn,将新的远程添加到svnproject/trunk/path/to/sharedcode(Git历史将被镜像到SVN,但这是最懒惰和最容易的方法)。

无论我使用什么具体解决方案,我都必须拆分git仓库或创建一个新的。这很重要。谢谢。 - mberns

0

我不同意Lazy Badger's answer。虽然你不能检出git repo的一部分,但是你可以检出git repo并在子树上使用文件系统操作。因此,您可以有两个检出:一个是svn repo的检出,另一个是git repo的检出。然后,您可以使用脚本(可能使用rsync)来同步适当的子目录。没有理由检查差异。版本控制将为您执行此操作。然后,您可以将更改提交到svn repo。此脚本可以作为cron作业运行。只要您只需要同步单个分支,就可以正常工作。

我暂时找不到代码,但我们有一个大型git repo,另一个团队的svn repo使用类似的方法维护子树的只读副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接