Git 分布式开发研究

  • 写这篇文章之前,笔者做过了一些测试。一直以来,笔者很想统一svn和git之间的代码,也很想统一来自不同的源之间的代码,使其一致,当然这里的一致是
    指在存在与同一个目录,自由切换显示不同源、不同版本控制工具,不同的版本之间的代码比较。经过研究发现,这种比较能够减轻代码不同而引起的各种“困
    惑”,让研发工程师更加“安心”。
  • 读这篇文章之前,确保读者预先了解了git的各种用法,包括svn,了解git和svn的工作模式以及ssh密钥的一些知识。


目录




Git 分布式开发研究




  • 写这篇文章之前,笔者做过了一些测试。一直以来,笔者很想统一svn和git之间的代码,也很想统一来自不同的源之间的代码,使其一致,当然这里的一致是
    指在存在与同一个目录,自由切换显示不同源、不同版本控制工具,不同的版本之间的代码比较。经过研究发现,这种比较能够减轻代码不同而引起的各种“困
    惑”,让研发工程师更加“安心”。
  • 读这篇文章之前,确保读者预先了解了git的各种用法,包括svn,了解git和svn的工作模式以及ssh密钥的一些知识。

研究目的


  • 很方便的比较复杂情况下的源代码异同;
  • git相比其他配置管理工具的优缺点;

研究对象


  • 配置管理工具git及svn

研究步骤


git基本用法


  • 以Conf-Libconfig为例,从网络上拷贝一份工程副本:

  > git clone git://github.com/cnangel/Conf-Libconfig.git

  • 当然git使用clone的时候,相当于已经建立了git的档案信息,git和svn不一样,不是在每个目录下建立一个档案目录,git只在工程顶层目录下建立一个.git的目录。如不想使用clone方式进行工程的网络方式拷贝呢?可以像下面一样,首先建立一个目录:

  > mkdir Conf-Libconfig

  • 接着,建立git的档案信息:

  > git init

  • 此时,如果不需要分布式开发,虽然 Conf-Libconfig 还是一个空目录,但此时Conf-Libconfig已经有了一个完整的版本控制系统;然后加上远程的工程目标信息:

  > git remote add libconfig git://github.com/cnangel/Conf-Libconfig.git

  • 查看一下libconfig是否添加正确:

  > git remote show

  • 添加本地分支信息master,并映射到libconfig上:

  > git config branch.master.remote libconfig
> git config branch.master.merge refs/heads/master

  • 可以查看一下信息是否添加成功:

  > git val -l

  • 开始从网络拷贝工程副本,这里是pull操作

  > git pull

  • 添加文件README.20100930

  > touch README.20100930
> git add README.20100930

  • 提交,这里是本地提交

  > git ci -m "add README.20100930"

  • 若需提交到服务器上,则:

  > git push 

  • 若查看日志信息,则:

  > git log
commit 7416697c131d179652b3caab4c97236844365e24
Author: cnangel <cnangel@gmail.com>
Date: Fri Jun 18 08:27:05 2010 +0800

      return result of config_setting_get_int_elem

  commit 3da0885d6a531d2d7b458b4884a83365fd070215
Author: cnangel <cnangel@gmail.com>
Date: Thu Jun 10 14:58:21 2010 +0800

      new version: 0.019

  commit 1081814723af0d4a84c8611dcf66ac9b5ce8bb0f
Author: cnangel <cnangel@gmail.com>
Date: Thu Jun 10 14:41:23 2010 +0800

      fixed by Diab Jerius

  • 若比较两个两个日志的版本,则:

  > git diff 1081814723af0d4a84c8611dcf66ac9b5ce8bb0f 7416697c131d179652b3caab4c97236844365e24
diff --git a/Libconfig.xs b/Libconfig.xs
index 00c3182..22a3ec6 100644
--- a/Libconfig.xs
+++ b/Libconfig.xs
-#if LIBCONFIG_VER_MINOR == 4
+#if (((LIBCONFIG_VER_MAJOR == 1) && (LIBCONFIG_VER_MINOR >= 4)) \
+ || (LIBCONFIG_VER_MAJOR > 1))

git svn用法



  • 在公司,往往使用svn服务器,使用svn服务器也可以使用git,不仅仅避免产生多余的版本控制,减少磁盘空间,重要的是使用了分布式的思想,能够脱离
    服务器,从而达到版本控制。对于svn服务器来说,git svn工具使用clone的手段,将svn服务器上的代码拷贝到本地,如:

  > git svn clone -s http://libibase.googlecode.com/svn libibase

  • 下载分支:

  > git svn fetch

  • 更新当前分支:

  > git svn rebase

  • 其他操作跟git一样,本地版本控制即可。

git多服务器工作方式


  • 如果有多个服务器源,且服务器源有svn也有git方式,怎么将svn服务器与git服务器,甚至多个服务器上进行分布式管理呢?
  • 方法很简单,多个git服务器,只需要:

  > git remote add mypro http://foo.com/mypro.git

  • 即可完成对多个git服务器源的添加,如果牵涉到svn服务器呢?首先,需要建立svn:

  > git svn clone -s http://libibase.googlecode.com/svn libibase

  • 然后,添加gitserver:

  > git remote add mypro http://foo.com/mypro.git

  • 注意建立git本地信息库的时候,需要:

 > git config branch.myself.remote mypro
> git config branch.myself.merge refs/heads/myself

  • 这样master分支仍然对应svn服务器,myself分支对应git服务器,当然笔者测试的结果svn服务器只允许添加一个,否则就会有冲突问题,这个问题是git svn工具的不足之处。
  • 当我们对不同服务器之间的同样的工程进行比较的时候,就变得简单多了,因为都映射到本地分支了,所以只需要:

  > git diff master myself

  • 即可完成两个分支的比较,是不是很方便呢?

总结


  • git是一种很好的版本控制工具,简单方便,学起来也非常容易。
  • git工具相比于svn工具来说,它减少了对服务器和本地数据的交换,减少了带宽,减少了服务器的资源消耗,而对于本地资源来说,也减少了磁盘消耗,无论在飞机上还是火车上,都很方便的能够提交版本。
  • git工具相比其他比如google的版本控制hg工具来说,有庞大的用户群,从linux kernel到google的chromiumos、chromium,到开源的perl以及QT,难道git工具还不值得推广使用么?

Categories

| | 评论(0)

发表评论

June 2011

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

关于此日记

此日记由 Cnangel 发表于 October 11, 2010 3:44 PM

此Blog上的上一篇日记【分享】搭建hadoop集群注意事项

此Blog上的下一篇日记fedora14的发布

首页归档页可以看到最新的日记和所有日记。

归档

Powered by Movable Type 5.11