首页 > 编程 > Hg代码管理转换Git代码管理-方便xcode使用Git

Hg代码管理转换Git代码管理-方便xcode使用Git

2012年9月27日 发表评论 阅读评论

最近搞iphone开发,iphone开发使用xcode是好必然的。虽然有其他开发工具,例如appcode。不过我觉得还是原生的xcode比较好。特别是查看帮助的时候非常方便。加上appcode这个工具是java开发的。运行速度不乐观。还有些开发者是vim+插件,我就真的不想折腾vim+插件。所以我老老实实用xcode。

xcode在在代码管理方面集成了svn和git的。svn现在来算已经是老古董了。所以使用git是必然的。不过公司使用的居然是Hg代码管理。这就真的难为了xcode了。由于xcode不支持Hg。虽然可以用其他图像化Hg软件来进行管理,例如SourceTree(支持Git和Hg)、MacHg。在代码对比与版本对比都没有使用xcode那样直观方便,可以边对比边修改开发。在xcode哪里非常方便查找出某一段代码是什么时候添加上去的。由谁添加的。当时代码提交的注释都会详细显示出来。这个功能非常实用。

现在需要把hg的代码库转换成git的代码库。

转换方式有:

1、一次性转换。把hg的代码库转成git的代码库。以后都用git代码库。

大家可用hg-fast-export 脚本

$ git clone git://repo.or.cz/fast-export.git

不过这个对于我来说不是一个好方面,因为你不能够要求公司以后都改用Git来管理。

2、使用插件把Hg转换成git。服务端为Hg,客户端数据为git的。

找了一下,发觉有一个比较有名的插件Hg-Git mercurial plugin。 不过是服务端是Git,客户端是Hg。与我的需求相反的。虽然在github.com上有几个Git-Hg的插件。当时看了一下说明好像都是在Hg-Git上修改的。而且都是只读单向的。即可以从Hg服务器上clone成Git的代码库,还可以pull新的更新。当是客户端的git代码库有文件修改后是不能push上Hg服务器的。

有点杯具啊。不过我认真研究Hg-Git后。发觉他可以把一个现有的hg项目推送一个空的Git服务。这样又出现一个新希望了。上网再搜索了一下,果然有人和我的想法有点相同。大家请点这里, 我的应用可能比他再复杂一点。

现在先见讲我现在的做法:

Hg服务器 《–》Hg客户端 《–》Hg-Git插件 《–》Git服务器 《–》Git客户端

网友是用现成的git托管服务的。当时公司的项目就不好用别人的托管服务。需要自己在本机搭建一个Git服务器。

关于如何安装Hg-Git插件,我这里就不说明了。因为Hg-Git官方网站和网友的网页都说明得好清晰。

现在讲一些他们没有提及的内容。

1、Git服务器的搭建。由于我们只有一个人使用这个服务器,而且是本机使用的,那些加密和权限管理都可以不需要。我们用最简单的方式搭建Git服务器就可以了。不过记得开防火墙。另外Hg-Git插件只支持git协议的Git服务器。不支持其他协议的Git服务器。

下边是建立Git服务器仓库的命令

$ pwd
/Users/daozhao/Documents/
$ mkdir GitServerData
$ cd GitServerData
$ mkdir GDB-iphone.git
$ cd GDB-iphone.git
$ git init --bare --shared

需要写一个Git服务启动的脚本。

$ cat start-git.sh
#!/bin/bash
 
git daemon --reuseaddr --export-all --enable=receive-pack --base-path=/Users/daozhao/Documents/GitServerData  >/Users/daozhao/Documents/GitServerData/git-server.log 2>&1 &

下边的脚本是把hg的数据提交到Git服务器,并数据更新到Git客户端。第一次使用的时候需先运行这个脚本把hg的代码库转换到Git。

$ cat hg-to-git.sh
#!/bin/bash
 
#GITPATH 是git代码库客户端
GITPATH="/Users/daozhao/Documents/公司资料/iphone5_Git"
#HGPATH 是HG代码库客户端
HGPATH="/Users/daozhao/Documents/公司资料/iphone5"
#GITSERVER 是git服务器代码库地址
GITSERVER="git://localhost/GDB-iphone.git"
 
echo "Change path to $HGPATH"
cd $HGPATH
echo "HG Push to Git server($GITSERVER)"
# 这里需要在hg设置一个bookmark "master". 下边"default"是你hg代码库的一个branches。
#你需要根据你的代码库更改。主要每一次推送数据上Git服务器,都需要重新设置这个master标签。
hg bookmark -fr default master
hg push $GITSERVER
echo "Change path to $GITPATH"
cd $GITPATH
#第一次运行把下边一行注释打开
#git clone $GITSERVER ./
echo "Git Pull from Git server($GITSERVER)"
git pull $GITSERVER

下班这个脚本是把git的更新数据更新到Hg客户端。Hg客户端数据并不会自动推送到Hg服务器,因为这里你可能需要做合并的操作。

$ cat git-to-hg.sh
#!/bin/bash
 
GITPATH="/Users/daozhao/Documents/公司资料/iphone5_Git"
HGPATH="/Users/daozhao/Documents/公司资料/iphone5"
GITSERVER="git://localhost/GDB-iphone.git"
 
echo "Change path to $GITPATH"
cd $GITPATH
echo "Git Push to Git server($GITSERVER)"
git push $GITSERVER
echo "Change path to $HGPATH"
cd $HGPATH
echo "Hg Pull from Git server($GITSERVER)"
hg pull $GITSERVER
hg update

这个方案可能在更新和合并操作有点复杂。我建议所有的合并操作在Hg客户端哪里进行。合并后更新Hg服务器并运行hg-to-git.sh脚本更新到git中。对于Hg上有多个分支的话我也不清楚如何做。好像公司的项目目前只有一个分支,不过有另外一个杯具的事情是那个分支名称不是“default”。hg-git插件从git服务器来下来的代码会默认使用”default”分支。所以就算其他同事没有更新代码。我还是需要在hg客户端进行一次合并操作。苦啊。

对于更新操作步骤如下:
1、git客户端commit好数据。
2、运行脚本git-to-hg.sh
3、在hg客户端pull Hg服务端,更新其他同事的最新代码。
4、合并代码。commit最新代码。提交上Hg服务端。
5、运行脚本hg-to-git.sh
相当复杂的操作。使用Hg代码管理的ios开发伤不起啊。代码的更新与上传可能并不是经常做,一天一次左右。而且写好脚本也方便很多了。

分类: 编程 标签: , , , ,
  1. bitwolaiye
    2012年12月6日22:02 | #1

    这个真心蛋疼,但是真心就是这么的蛋疼。谢谢楼主,试用中。。。。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.