Archive for the ‘Git’ category

如何给 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

Configure Manager Rules

November 18th, 2014

CM的职责就是对与git 进行管理,将不合格的commit拒绝在仓库以外。

详细开发流程

但是每周CM的职责除了合并开发成员的branch外,还要进行commit的汇报,比如commit多少,merge多少,reject多少等等。

比如我们将个git log >/tmp/git.log文件中,然后进行分析。

比如我们统计git log 中的commit 信息 可以使用 grep commit git.log | wc -l 方式计算commit行数。

$grep commit git.log | wc -l
$grep Merge git.log | wc -l

因为git log 的数据非常整齐,可以使用vim的块操作

输入v进入visual模式,然后可以移动光标选取一段文本。

d———->剪贴

y———->复制

p———->粘贴

对于经常登陆的机子我们可以生成dsa

use ”ssh-keygen -t dsa” to generate a key
then use ”ssh-copy-id /home/lzz/.ssh/id_dsa.pub user@server IP”
Ok, now you can ssh and git pull/push without password

对于一些system如果ssh-copy-id 无法使用,我们可以手动将/home/lzz/.ssh/id_dsa.pub 手动拷贝到目标机器的目标用户目录下,
比如/home/user/.ssh/id_dsa_pub.A. 然后将这个id_dsa_pub.A >> authority 后面。

这些是CM的日常工作,除了这些,对于master branch与 local branch的backup也非常重要。
比如我有两台机子都要备份,我们可以把资料相互备份然后传输到对方的机子上。我们知道两台主机数据同时损坏的概率非常下。

对于每台主机,CM应该记录到以下几点:

security incidents
power-fail
server off-line
filesystem overruns (filesystem full)
dmesg warnings/errors
abnormal operational behavior

backup_policy

cm_rules

对于一些备份的例行任务,我们可以使用crontab -e 命令创建定时任务,关于这个网上的使用比较多,我们可以参考
http://www.cnblogs.com/peida/archive/2013/01/08/2850483.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标准开发模型