我们在工作的过程中,通常会遇到新建项目的需要,比如项目经理提出我们需要基于linux-4.18的内核版本创建新项目A的需要,大部分做开发的人员可以会一头雾水了。下述步骤是在ubuntu16.04上执行的结果,其他linux系统类似.
1. 建立远程git 仓库和本地git repo
- 建立远程git仓库:
cd /opt; sudo mkdir git_linux_dev.git; sudo chmod 777 git_linux_dev.git/;
cd git_linux_dev.git/; git --bare init
当执行完上述命令之后便成功建了一个空的远程git repository,该仓库可以记录版本库的历史纪录,但是不包含工作目录(working tree).
- 建立本地的git repo
如上图需要创建一个本地工作文件夹git_linux_dev,之后按照cd git_linux_dev/; git init, 执行完上述步骤,便在本地创建了一个git repo, 该仓库可以记录版本库的历史纪录和实际项目源文件的copy(即包含项目当中的.c, .h…等文件).
2. 在本地的git repo添加远程的git 仓库
- 在git_linux_dev下创建一个README.md文件,vim README.md可以输入如下文字然后保存:
# Create a new project based on linux-4.18
# Need to include all of linux commit
- 添加远程仓库到本地
git remote add origin ssh://xuchao@192.168.153.131:/opt/git_linux_dev.git
检查是否add成功,可以通过如下方法检查
cd .git/; vim config
- 把本地的修改提交到远程git仓库
上述我们新建了一个README.md文件并添加了一些内容,需要把这个文件更新到远程仓库,通过如下步骤
git status; git add README.md; git commit -s(需要填写commit information)
运行git log便可以看到我们刚才的提交list, 但是这个提交还保存在本地并没有update到远程,接下来就需要push到远程了:
git push origin master
- 本地clone远程的代码
至此我们已经将本地和远程同步了,删除本地的git_linux_dev(rm -rf git_linux_dev), 通过clone命令拉远代码,也可以确认是否和前述的步骤一致,命令如下:
3. 拉取linux-4.18的代码并需要所有的commit-id
我们知道kernel的代码可以在(https://git.kernel.org/)(git方式拉取),所以需要按照如下步骤:
- 添加linux code的远程仓库并拉取代码
git remote add linux https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch linux(这个过程需要花费较长的时间,需要耐心等待)
通过上述步骤可以通过git branch -a, remotes/linux/master已经被加入到远程分支了
- 基于linux.git创建一个新的linux-4.18的branch
git checkout -b linux-4.18 linux/master
git tag
git reset v4.18 –hard
至此我们已经checkout出一个新的linux-4.18的分支了,并且处于HEAD的提交就是4.18,可以通过git log –oneline查看.
- 把linux-4.18上的内容搬移到开发master分支,并保留有linux的commit-id
我们知道mstar分支目前还只有一条提交(2中的操作),接下来需要把linux-1.18中提交merge到master分支中,操纵如下:
git checkout master;
git log --oneline;
git merge linux-4.18;
git log –oneline
至此我们可以看到linux-4.18上的所有提交已经checkout到master分支了,并且还保留有linux的commit-id(便于后期在开发过程中的查找),同时还包好我们认为添加README.md的提交(处于第一条)。
4. 本地修改push到远程仓库
经过上述的步骤,linux-4.18的代码已经merge到master分支上了,但是只保存在本地,如果代码丢失或者有其他合作开发的同事想拉取该代码就非常困难了,所以需要把本地修改的代码push到远程仓库,即使本地代码丢失也可以通过git clone的方式重新下载。
Upload本地代码到远程仓库:
git push origin master
Download远程分支代码到本地:
git clone ssh://xxx@ip:path(xxx为用户名,ip为本机的ip地址,path为远程仓库的绝对地址)
5. 给linux社区发送patch
如果我们在开发的过程中发下linux的代码本身存在bug, 那么可以通过给社区发送patch来fix这个问题.
- 订阅内核邮件列表(Linux Kernel Mailing List, LKML), 是linux开发者进行发布/讨论/技术辩论的主要途径. 可以通过发送subscribe linux-kernel you@email.com到majordomo@vger.kernel.org.LKML是一个综合的邮件列表,会收到所有的linux模块,如果对某一个模块感兴趣的作者也可以订阅其中的一个模块,http://vger.kernel.org/vger-lists.html网站列出了模块。
- 如何制作补丁
1. 基于linux内核主仓库最新的主分支创建一个新的分支
git checkout -b “my_branch”
2. 修改文件,需改后的patch是需要经过测试的,包括编译测试,单元测试和功能测试
3. 生成新的comment
4. 生成补丁
git format-patch -1 #生成一个补丁
5. 对补丁进行代码格式检查
./scripts/checkpatch.pl your_fix.patch
- 如何发送补丁
1. 推荐使用git send-email工具来发送不懂到linux内核社区, 安装git send-email工具方法如下:
sudo apt-get install git-email
2. 配置git send-email, 修改~/.gitconfig, 添加如下配置
[sendemail]
smtpencryption = tls
smtpserver = smtp.126.com
smtpuser = anglexuchao@126.com
smtpserverport = 25
3. 使用./scripts/get_maintainer.pl来获取这些模块的维护者和邮箱
./scripts/get_maintainer.pl you_fix.patch
4. 发送补丁,步骤如下
git send-email --to maintainer@email.com 0001-you-fix.patch