我知道这里已经有很多版本控制的问题,但是没有一个提出的解决方案完全符合我的要求,我也找不到一种方法来把它们拼凑在一起。我已经寻找了一个星期。
我的设置:
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-svn 在
gitproject/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/sharedcode
和svnproject/sharedcode
上运行git diff
,将输出重定向到 txt 文件中,使用可怕的 WindowsIF
语句,如果diff
检测到除 README 以外的任何更改,就将gitproject/sharedcode
的内容使用ROBOCOPY /MIR
命令复制到svnproject/sharedcode
中,从备份中恢复正确的 README 到svnproject/sharedcode
,执行svn add
,在远程仓库上执行svn checkout
,然后最后执行svn commit
。但是它没有成功。
我相信我已经拥有了解决方案的所有部分,但我缺乏知识和编程技能来将它们整合在一起。我希望 stackoverflow 可以帮助我。