自动将Git同步到SVN

3

概述:

我希望能够定期将一个裸的Git仓库推送到Subversion中,以便他人可以检查它,使用一个无人值守的脚本。我不需要相反的方向,即SVN-> Git。

我希望有人能帮助我完成这个任务。我看到的其他线程非常接近我需要的内容,但没有完整、可行的解决方案。将现有的git存储库推送到SVN非常有帮助。

我的问题:

我的雇主维护着一个Subversion服务器,该服务器具有远程备份、冗余,并且可以通过Web界面访问,以便我的同事和经理可以进行日常审查。

我有六个Git项目。(我有多台机器,我进行了很多推测性的分支,我经常提交。此外,Xcode与Git配合使用效果更好。我们的SVN管理员同意Git对于我来说是不可避免的。)我一直通过在桌面机器上保留一个裸仓库(由我的雇主拥有并位于其场所),所有工作副本都跟踪它来实现这一点。

我的雇主真的希望我不要这样做;如果他能提供IT级别的Git服务器,那就好了。他的妥协是我找到一种方法,让一个launchd (cron)任务将我的桌面裸的Git仓库与SVN服务器上的一个并行仓库同步。

我的方法(可能不令人满意):

我没有找到任何关于克隆裸Git存储库到Subversion的指南,更不用说无人值守地进行了。我的猜测是,我必须通过工作副本来完成所有操作,对于其同步到SVN(但也许不是自动化)是一个已解决的问题。

我的天真过程是:

  1. 从裸库中克隆一个永远不会编辑的工作副本到/dont-touch目录中。
  2. 在不编辑的/dont-touch目录中,执行git svn init <svn-url> -s
  3. 执行所需的git svn fetchgit svn rebase操作。
  4. 每晚,根据launchd触发的脚本:
    4.1. cd /dont-touch
    4.2. git fetch
    4.3. git svn dcommit

问题:

我无知

话说得够多的了。

这类问题包括我没有想到的所有事情。

交互性

我们希望能够设置它,让同步脚本每24小时触发一次,并将其遗忘。

SVN认证会被缓存,并且在第一次手动(1-3步)设置后自行处理。Git认证不是问题,因为“dont-touch”工作副本将由与裸仓库相同的用户拥有,并且可以通过“file:///”访问。但是我对将Git同步到SVN的印象是它很脆弱,需要交互式地微调以避免损坏SVN仓库,更不用说使其正常工作了。

我认为,这个答案将会回答你大部分的需求。 - Lazy Badger
1个回答

2
你可以尝试使用 SubGit 作为 git-svn 的替代品,它可以在2.0版本中将本地Git与远程Subversion仓库链接起来。你只需要运行以下命令即可:
$ subgit configure --svn-url <URL_of_SVN_project_root> repos.git
# edit repos.git/subgit/config, repos.git/subgit/authors.txt, and repos.git/subgit/passwd

$ subgit install repos.git
# now just work with repos.git as with usual git repository, but prefer "git pull --rebase" rather that "git pull" and "git merge --no-ff" rather than "git merge"

其中URL_of_SVN_project_root是包含trunk/branches/tags目录的URL。

然后克隆存储库'repos.git'并从它推送/拉取(可以选择设置工作副本git config 这种方式)。 'repos.git'中的特殊Git钩子将使其与SVN同步。请注意,当前SubGit 2.0处于eap阶段,但我认为它比您描述的git-svn设置更可靠。


这看起来非常有趣。为了让我有机会测试它,需要一些繁琐的手续,所以在我能将其标记为首选答案之前可能需要一些时间,但这是一个很有前途的方向。 - Fritz Anderson
好的,我已经能够处理这个了,看起来非常顺畅,但是有一个小问题/误解: - Fritz Anderson
@dimitry-pavlenko 好的,我已经能够使用subgit,并且它看起来非常顺畅,但是有一个问题/误解:您展示的subgit configure命令意味着repos.git可以是现有的存储库。当我尝试这样做时,我收到了“配置失败”的消息,抱怨无法配置不为空的Git存储库。我真的希望不要从头开始创建存储库。更正?解决方法?subgit-2.0.0-EAP_2018 - Fritz Anderson
看起来你已经找到了答案,但我还是会在这里放上答案。你可以尝试从这个问题构建或等待下一个EAP/发布版本。该命令应该与我描述的完全一样。 - Dmitry Pavlenko
使用SubGit时,是应该将SubGit存储库保留在本地,还是可以将其放置在服务器上并由多个用户使用? - NilsH
两种选项都是可行的(对于本地使用,可以使用“git clone --shared <path/to/bare/git/repository>”克隆结果Git存储库以节省磁盘空间),第二个选项更好,因为它节省了初始克隆所花费的时间。 - Dmitry Pavlenko

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