将git工作目录的改动应用到svn

之前在维护自己写的WordPress插件时,为了能够方便地同时向GitHub仓库和WordPress官方的svn仓库提交,我只在本地维护了一个git工作目录,然后用 git svn dcommit向svn仓库提交,用 git push向GitHub提交。(详见我之前写的日志。)

但可能是因为WordPress官方的svn仓库太大,历史记录太多,而git-svn的内部实现又有点问题,所以最近几次我用 git svn rebasegit svn dcommit都毫无反应。思来想去,为了不耽误时间,我还是决定老老实实用svn客户端了。

于是现在我本地就有了两个目录:一个git工作目录,用于向GitHub提交;一个svn工作目录,用于向svn提交。由于svn里的分支和标签实际上就是目录,因此svn工作目录下还有trunk、branches和tags子目录。trunk子目录里的内容才和git工作目录里的内容相同。

一般我是在git工作目录下写代码,因此思路是在git工作目录commit之后,用 git diff生成patch文件, git log输出提交日志到另外一个文件。然后用 patch命令将 git diff应用到svn工作目录。最后 svn commit的时候利用git log的输出,这样就可以做到svn trunk分支的提交和git master分支的提交一一对应。这个过程如下图所示:

继续阅读将git工作目录的改动应用到svn

对一个项目同时使用svn和git两个远程仓库

以前曾经和朋友讨论过在一个项目中同时使用svn和git两个远程仓库的可能,如今真的遇到了这样的实际需求。

在开发WordPress插件External Media without Import的时候,因为希望插件能在WordPress官方渠道发布,所以需要在WordPress官方提供的svn远程仓库上托管这个项目。WordPress官方给我提供的svn仓库的地址是https://plugins.svn.wordpress.org/external-media-without-import/

但另一方面,考虑到github作为开源社区的人气,以及fork、pull request等代码贡献的便利性,我也想在github上托管这个项目。因此我在github上也创建了一个仓库:https://github.com/zzxiang/external-media-without-import.git

与此同时,我希望本地只需要维护一个项目文件夹,或者绝大部分操作只需要在一个文件夹中执行。这个文件夹由git管理,并可以方便地与WordPress的svn和github双方同步。不过后来经过一段时间摸索,我似乎只能做到让git和svn仓库的trunk分支同步,但这也足够了。

也就是说,我希望实现的应用场景如下图所示:

继续阅读对一个项目同时使用svn和git两个远程仓库