Posts Tagged ‘Git’

如何给 kernel.org 下的项目贡献代码

March 17th, 2016

kernel的开发模式,不用细说了,直接切入正题!

1.  首先你总要把kernel-stable 和 linux-next git仓库克隆下来

2.  修改文件,blabla…. 然后使用 git 生成补丁

git format-patch -1

git 会将最近一次的提交生成补丁文件,可以在当前目录下看到 0001-*.patch 文件

3.  使用邮件发送你的 patch 给 maintainer 与 mailing list

代码库下会有文件描述 maintainer 的信息,这里以 rt-tests 为例,在 MAINTAINERS 文件中有 maintainer 的邮件地址,可将你的patch 发给上述地址。

4.  使用 Mutt 发送 patch
Mutt是一个命令行界面下的邮件客户端,具体配置方式这里就不再赘述,可以参考http://jingyan.baidu.com/article/0aa22375bbc3be88cc0d6425.html 来配置。

===================

如果遇到大patch的话,社区通常会reject,我们需要把patch分成若个小patch,每个patch叙述一部分功能,这样可以方便review,而且使得源码容易维护。那么如何拆分大patch呢?

比如这时在本地我们已经提交了一个大patch,然后可以执行以下操作:

1.  将当前提交撤销,重置到上一次。

$ git reset HEAD^

2.  通过补丁块拣选方式择要提交的修改。 Git 会逐一显示工作区更改,如果确认此处动要 会逐一显示工作区更改,如果确认此处动要提交,输入 “y“。

$ git add -p

以撤销提交的说明为蓝本,撰写新的commit。

$ git commit -e -C HEAD@{1}

3.  如果提交代码过于密集,耦合太强,那么上面这种方式不太适用,那么这时可以 直接编辑文件,删除要剥离出此次提交的修改然后执行:

$ git commit -- amend

然后执行下面的命令,还原有文件修改再提交:

$ git checkout HEAD@{1}-- .
$ git commit

 

参考:

http://jingyan.baidu.com/article/0aa22375bbc3be88cc0d6425.html

使用git生成patch文件

November 29th, 2015

经过两个月的奋战,我的找工作之旅告于段落,博客也荒废了,现在开始逐渐更新…

之前与CRIU团队交流的时候,团队成员发给我一个patch,让我打在git master分支上,直接使用。我当时还没有意识到可以使用git am命令,傻乎乎的使用patch < 操作patch,费力不讨好。。。

$git am -3 -i xxx.patch
Commit Body is:
--------------------------
commit message....
--------------------------
Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all  y
applied: commit message....

但是这个文件文件是如何生成的呢?其实也非常简单,只需要使用git format-patch 命令即可生成,其中 -1 就是以HEAD指针为基准的几个commit提交打成patch,非常类似于HEAD^ 或者是HEAD^^:

$git format-patch -1

这个时候在git目录下,生成0001-commit-message.patch类型的patch,如果使用vim打开看的话,可以发现除了常规的patch文件,还存在git commit 信息,这些信息比起单纯的diff命令多了一些内容,可以被合并到git分支中。

如果我们使用git am 合并失败的话,会进入单步执行模式如果我们要退出这次合并,直接使用git am –abord,然后就可以再次使用git am进行合并。如果我们没有退出这个模式,再次使用am合并,会出现下面的错误提示信息,在.git/rebase-apply/ 中存在文件,如果am成功,则这个文件不存在。

.git/rebase-apply still exists but mbox given.

如果你发现这个冲突是无法解决的, 要撤销整个am的东西。 可以运行git am –abort,如果你想只是忽略这一个patch,可以运行git am –skip来跳过这个patch.

 

 

参考:

http://blog.csdn.net/xzongyuan/article/details/9425739
http://blog.csdn.net/wh_19910525/article/details/19416857

Documentation/SubmittingPatches

git多分支开发

July 14th, 2015

虽然网上有很多关于git多分支开发的介绍,但是有时候在项目中使用的多分支还是让我非常混乱。最近我参与了一个“elinux.org 中文版: 嵌入式 Linux 知识库”的翻译计划。

eLinux.org 是 Linux 基金会下属 Consumer Electronics Linux Forum 维护的一个 Embedded Linux Wiki。该 Wiki 全面系统地梳理了嵌入式 Linux 方方面面的知识。

该项目致力于翻译 Embedded Linux Wiki 为中文版。欢迎fork我的分支,一起参与elinux.org的翻译工作!项目:https://github.com/lzz5235/elinux

由于这个项目启动时间不久,经常出现了上游分支大量的修改,此刻我已经开始了一些翻译工作,而我如果从远程拉取修改,会和本地产生严重的冲突,非常麻烦。之后为了解决这个问题,在原有master分支上,我在本地创建了一个development分支,用来开展翻译工作。

$git branch development
$git checkout development

当切换到开发分支,我们就可以开始翻译链接了,当翻译完毕之后,我们需要使用git add、commit提交。然后我们可以切回master,首先我们需要把master分支中的内容更新到最新(可以使用git fetch ,也可以使用git pull)。这里我们可以使用git merge development合并开发分支,这个时候,我们需要一个一个解决冲突,而且产生大量的Merge 的提交,非常不美观与无用。

或者我们在master分子下使用git rebase development,这个时候git会根据开发分支做的修改,这些命令会把”development”分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到”.git/rebase”目录中),然后把”master”分支更新 为最新的”origin”分支,最后把保存的这些补丁应用到”master”分支上。

这其中如果有冲突会一个一个的去解决具体就是执行git rebase –continue/–skip/–abort

$ git checkout master
$ git rebase project/master
$ git push

最后我们就可以顺利的提交了,master分支没有多余的Merge提交!如果我们继续翻译工作,那么切换到development分支,然后进行git rebase master操作。开发分支更新完毕后,我们继续翻译工作!

当然,我们也可以使用git pull –rebase,这个相当于重建了master主线分支,就是上面操作的集合!

 

啰嗦半天就是我们要尽量使用git rebase 方式,减少大量不必要的Merge提交!

http://blog.csdn.net/hudashi/article/details/7664631
http://git-scm.com/book/zh/ch3-2.html

Git标准开发模型

August 17th, 2014

之前用了很长时间的git,最近才了解到git的正确用法。

正如Nicholas said:Using git is very easy but using git correctly is not easy!

git文件最好是以二进制的存在,这样比较容易对文件进行追踪。最好不要将binary文件add进来!doc?exe?No!

» Read more: Git标准开发模型

创建Git服务器

August 16th, 2014

之前一直都是使用git 客户端,非常的方便,可以通过分支并行开发,加快项目开发速度。

git的使用我就不赘述了,这里我记录一下如何创建git 服务端。

» Read more: 创建Git服务器