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工具还不值得推广使用么?

Monthly Archives

Pages

Powered by Movable Type 7.7.2

About this Entry

This page contains a single entry by Cnangel published on October 11, 2010 3:44 PM.

【分享】搭建hadoop集群注意事项 was the previous entry in this blog.

fedora14的发布 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.