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

Posted 子子翔的技艺空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将git工作目录的改动应用到svn相关的知识,希望对你有一定的参考价值。

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


但可能是因为WordPress官方的svn仓库太大,历史记录太多,而git-svn的内部实现又有点问题,所以最近几次我用 git svn rebase和 git 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分支的提交一一对应。这个过程如下图所示:



目录结构如下所示:


$ pwd

/Users/zhixiangzhu/emwi

$ ls -R

git svn

 

./git:

README.md license.txt

external-media-without-import.css readme.txt

external-media-without-import.js screenshots

external-media-without-import.php

 

./git/screenshots:

screenshot-1.png screenshot-2.png

 

./svn:

assets branches tags trunk

 

./svn/assets:

banner-1544x500.jpg icon-128x128.jpg screenshot-1.png

banner-772x250.jpg icon-256x256.jpg screenshot-2.png

 

./svn/branches:

 

./svn/tags:

1.0 1.0.1 1.0.2 1.0.2.1

 

./svn/tags/1.0:

external-media-without-import.css license.txt

external-media-without-import.js readme.txt

external-media-without-import.php

 

...

 

./svn/trunk:

README.md license.txt

external-media-without-import.css readme.txt

external-media-without-import.js screenshots

external-media-without-import.php

 

./svn/trunk/screenshots:

screenshot-1.png screenshot-2.png


显然我在其中一个工作目录下做出改动后,还要将改动同步到另一个工作目录并提交。人工同步改动显然繁琐耗时又容易出错,需要自动化。我写了一个脚本git2svn.sh,用于将git工作目录中最新提交所做的改动应用到svn工作目录并自动提交到svn仓库。这个脚本就放在与git工作目录和svn工作目录同级的地方。可以在git工作目录中执行,也可以在父目录中执行:


$ pwd

/Users/zhixiangzhu/emwi

$ ls -R

git svn git2svn.sh


脚本内容如下:



脚本第17行的perl命令的作用是将 git log -1 --format命令输出的git_n.log文件末尾的空行删掉,见https://stackoverflow.com/a/1654042。其中-p的作用是打印输入文件git_n.log的每一行, -e的作用是执行-e后面的perl代码。详见这篇Perl命令行参数的说明:https://www.perl.com/pub/2004/08/09/commandline.html/。 chomp用于去除空行。


不过这个脚本没有文件的添加和删除。对这两个情况还需要分别调用 svn add和 svn delete,等以后遇到这个需求再改进吧。


以上是关于将git工作目录的改动应用到svn的主要内容,如果未能解决你的问题,请参考以下文章

git的基本使用

GitGit简介

如何恢复SVN工作副本中的ONLY目录?

svn与git操作对比 (未来有空做一个 svn与git实战对比 )

Git学习

Git学习