使用git进行分支间的合并

使用svn的时候,在分支之间的合并,使用svn merge进行操作,同时也可以合并部分目录和文件。

现在开始使用git,一开始只是知道git merge,将不同分支完整合并到另一分支。但我的实际需求是,将某一次或某几个commit,合并到几个不同的分支上。

搜索后发现可以使用git cherry-pick命令,可以非常好的解决这个需求。

 

参考:

http://stackoverflow.com/questions/881092/how-to-merge-a-specific-commit-in-git

从svn转换到git

数据中心之前的代码一直使用svn进行管理,现在team已经转换到git了。需要将之前的版本代码也全部转换到git了。
转换步骤在这本git书中有详细的说明:
但在试验过程中,发现有几处地方不能完整执行,需要进行修改。修改后的代码如下:
#clone metadata
git svn clone https://svn.westgis.ac.cn/svn/westdc/metadata --authors-file=users.txt --no-metadata --stdlayout westdc-zf1

#convert tags to local
git for-each-ref refs/remotes/origin/tags | cut -d / -f 5-| grep -v @ | while read tagname; do git checkout -b "$tagname" origin/tags/$tagname; git checkout master; git tag $tagname $tagname;git branch -D "$tagname";git branch -r  -d "origin/tags/$tagname";done

#convert branches to local
git for-each-ref refs/remotes | cut -d / -f 4- | grep -v @ | while read branchname; do git checkout -b "$branchname" origin/$branchname;git branch -r -d origin/$branchname; done

git remote add origin git@git.westgis.ac.cn:westdc/westdc-zf1.git
git push origin --all
git push origin --tags

 

转移并升级svn+trac开发环境

之前svn+trac的开发环境是部署在一个很老的服务器上,现在欲逐步淘汰旧服务器,就想把开发环境也转移到新的服务器上。
转移过程中发现的问题记录如下:

1. 需要拷贝的文件:
apache配置文件、svn库文件、trac库。
2. 在新服务器上安装配置:
2.1 配置SSL支持,将之前生成的crt文件拷贝过来即可。
2.2 配置apache的插件,包括svn,auth_mysql,python等。
2.3 恢复老服务器上的文件,将老服务器上的文件都恢复到之前对应的位置。要注意权限的对应。
3. 版本库和trac库升级
使用svnadmin工具和trac-admin工具升级对应的库。

svn move/copy: 用分支替代主干

svn merge可以将一个分支上的变更应用到另外一个分支上,在小功能的开发与合并有很大的作用,但有的时候会从分支上发起一个全新的系统,从而最终替代原主干上的代码,此时svn merge就不可用了,因为需要更换的地方很多,而此时就可以考虑使用svn move、svn copy等来一次性的转移。

svn move https://repository/path/to/trunk https://repository/path/to/branches/old-trunk-branch
svn move https://repository/path/to/branches/new-trunk-branch https://repository/path/to/trunk

后面的一个命令若想保留原来的分支进行先导性开发,也可以使用svn copy命令,这样就实现了新旧分支的替换。

svn merge:主干与分支之间的合并

合并是svn使用的一个难点,合理使用merge功能可以减少很多不必要的工作,提升工作效率。

实例1. 从主干到分支的合并
在主干中某部分的功能已经得到了修改和增强,现在想把这些增强的功能应用到分支上,就可以这样操作:

svn merge -r 1804:HEAD https://svn.westgis.ac.cn/svn/westdc/metadata/trunk/application/admin/controllers/DownController.php

其中,分支自r1804创建以来,只做过小修改,而主干这个功能已经得到极大增强,所以可以合并,在合并的过程中,冲突是最常见的一种情况,要看情况决定使用mc我的版本(即本地版本)、tc他人的版本(即主干中的版本)或e进行编辑直接修改冲突的地方。

合并完成后首先检查本地合并后的版本能否运行,然后再进行提交(有效的文字描述能减少很多工作量)。

svn commit -m “merge trunk admin DownController changes [1804]:[2452] into the branch”

在ubuntu gutsy下编译codeblocks svn版本

本来一直用的是feisty下的一个源:

deb http://lgp203.free.fr/ubuntu/ feisty main

但是自从svn4413版本后就出现问题了,执行codeblocks提示错误:

codeblocks: /usr/lib/libwx_gtk2u_aui-2.8.so.0: version `WXU_2.8.5′ not found (required by codeblocks)

因此,决定自己编译SVN版本,首先下载:

svn co svn://svn.berlios.de/codeblocks/trunk codeblocks

编译前首先要作一些准备工作:

sudo aptitude install debhelper fakeroot wx-common

然后修改codeblocks/debian/control文件,使其中的一些依赖替换为当前gutsy里的版本:

Build-Depends: debhelper, autotools-dev, libc6-dev, libstdc++6-4.1-dev, libwxgtk2.8-dev, wx-common, zip

然后就可以编译了:

cd codeblocks
./bootstrap
dpkg-buildpackage -rfakeroot

编译完成后在上一级目录就生成了对应的deb包。

整合phpbb3和svn服务

整合,题目有点大,呵呵。
其实就是把SVN的用户控制交给phpbb3来进行处理。
要求SVN必须采用apache2/mod_auth_mysql来进行控制的。
然后在phpbb3的后台创建一个新的用户组,用于控制可以访问SVN服务的用户。然后在mysql里创建一个视图,提取用户名称和密码。注意,PHPBB3采用的加密方式是直接MD5。假设创建的组名为svn:

create view svnauth (username,passwd,groups) as select users.username,users.user_password,groups.group_name from groups,user_group left join users on user_group.user_id=users.user_id where groups.group_name=”svn” and user_group.group_id=groups.group_id ;

然后在apache2的site文件里设置为:

Auth_MySQL_Encryption_Types PHP_MD5

这样就可以了,具体的操作还需要参考之前的文章:安装subversion: ssl+auth_mysql+mod_svn

估计还需要mysql 5的支持,不知道mysql 4是否支持视图。

svn中转移库及彻底删除某目录

本机上已经有的svn库,如何合并到服务器上已经运营的svn呢?
可以这么处理:

svnadmin dump /your/svn/repository/path > svn.dump

同时,若某个project我不想上传到公共服务器与大家共享,或者是一个脏导入,可以这样删除:

cat svn.dump | svndumpfilter exclude /do/not/upload/project/name > newsvn.dump

然后再上传到服务器上进行处理:

scp newsvn.dump myserver:/path/

ssh登录到服务器上后再接着处理:

svnadmin load /repository/path

这样就可以合并本机的project到服务器上,并且和原有服务器上的project不会冲突。