Linux上传代码的步骤与注意事项

news2025/1/16 5:15:52

最近因为工作需要,要上传代码到 DPDK 上,代码已经上传成功,记录一下过程,给大家提供一个参考。我这次需要上传的是pmd,即poll mode driver。

Coding Style

要上传代码,第一件事就是需要知道Coding Style。当然,在写完代码后,通过格式调整工具进行调整也是可以的,但是如果我们养成了良好的代码习惯,那将节省掉很多不必要的工作量,这在我的第一次上传经历中体现的尤为明显。代码本身因为我本次测试过很多遍,所以不会有太多改动,格式问题是一个重要的修改方向。

DPDK的Coding Style在之前的文章中有提到,它基本和Linux Kernel的是一致的,这里我单独拿出一些来讲,需要看详细的可以参考我的文章。

DPDK Coding Style文章浏览阅读182次。最近看了一下 DPDK Coding Style,做了一下总结,分享一下。https://blog.csdn.net/weixin_39950873/article/details/1315347541、行长最好不要超过80个字符,注释也是一样。

2、Tab应该是八个字符宽

3、注释最好不要使用 //

4 、缩进的话最好使用tab,如果多个tab无法做到,比如只差7个字符,那就用七个空格。而空格一般是用来对齐的。具体如下:

unsigned long really_long_proc_name(unsigned long x, unsigned long y,
				                    int a)
|------||-------||------||-------|__
   t        t       t       t     ss
{
        p1 = first_procedure (second_procedure (p2, p3),
			                  third_procedure (p4, p5));
|------||------||------|______
   t       t       t    ssssss
}

5 、if else需要对称,比如if只有一条语句,而else有多条,那你不能if就不用大括号了,而else用。当然,如果if和else都只有一条语句,那记得不要用大括号。

CHECK:BRACES: braces {} should be used on all arms of this statement (from ./checkpatch.pl)
#268: FILE: drivers/net/r8169/r8169_hw.c:67:
if (len <= 4 - val_shift)
	stmt;
else {

然后呢,我给大家推荐两个工具。第一是checkpatch.pl。它是Linux Kernel自带的,它不光检查代码格式,也会检查你的patch的其他内容,一般都需要先执行一遍才行。一句示例命令如下:

./scripts/checkpatch.pl --no-tree --ignore=CAMELCASE xxx.patch

第二个是老朋友了,即astyle。它可以帮助我们调整代码格式,至于option可以自行根据需要选择。但是他在对缩进方面存在一些问题,做不到我上述第四点的情况。也是提供给大家做一个参考。

自动调整代码格式——astyle详解icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_39950873/article/details/131635456

2 了解你要上传的项目

比如你要上传到Linux,那你一定要去了解它怎么上传,上传到哪里等等一系列的内容,不然就会像没头苍蝇一样乱撞。我这里以DPDK为例。

2.1 DPDK 开发流程

- 代码托管在公共 git 存储库中。
- 有一个邮件列表,开发人员可从中提交补丁。
- 有分层组件的维护者。
- 补丁在邮件列表中公开审核。
- 成功审核的补丁将合并到存储库。
- 补丁应发送至目标存储库或子树,见下文。

DPDK 开发的邮件列表是 dev@dpdk.org。贡献者需要注册邮件列表才能提交补丁。

2.2 源代码许可

DPDK 对核心库和驱动程序使用开源 BSD-3-Clause 许可。内核组件采用 GPL-2.0 许可。DPDK 在源文件中使用 Linux 基金会 SPDX 项目定义的单行唯一许可证标识符引用。

2.3 Maintainers and Sub-trees

DPDK 维护层次分为主存储库 dpdk 和子存储库 dpdk-next-*。比如我这次要上传的pmd,它的子储存库就是dpdk-next-net,那么在git clone的时候,就得git clode它才行,不能搞错了。

其次呢,我要上传pmd,并不是一个修改的patch,所以作为maintainer,我需要在MAINTAINERS文件里更新我的信息。

2.4 里程碑

DPDK每年的小版本有三个,分别在三月七月和十一月更新版本。每次更新都会有rc1 ~ rc4这个阶段,不同阶段的工作如下,所以我们应该在此之前上传对应的patch,当然,早一点总比晚一点强。

rc1:优先级:库。-rc1 之后不应接受任何库功能。

rc2:优先级:驱动程序。-rc2 之后不应接受任何驱动程序功能。

rc3:优先级:应用程序。-rc3 之后不应接受任何应用程序功能。

rc4:文档更新。

3 Git

在Linux上上传代码,用Git十分常见,这里也做一些介绍。

3.1 获取源码

我们需要把源码通过 git clone 克隆到本地然后再做进一步的操作。如上文所说,你得知道你应该git clone的代码是什么。DPDK有主仓库和子仓库如下:

main repository:

git clone git://dpdk.org/dpdk

git clone https://dpdk.org/git/dpdk

sub-repositories (list):

git clone git://dpdk.org/next/dpdk-next-*

git clone https://dpdk.org/git/next/dpdk-next-*

这里我们要git clone的就是子仓库dpdk-next-net,在修改前就应该搞明白,不要走冤枉路。

3.2 Commit Message

3.2.1 主题行

git 提交消息的第一行(摘要)将成为补丁电子邮件的主题行。

- 摘要行必须捕捉变更的区域和影响。
- 摘要行应约为 50 个字符。
- 除首字母缩略词外,摘要行应小写。
- 它应以组件名称作为前缀(使用 git log 检查现有组件)。
- 使用动词的命令式(如对代码库的说明)。
- 不要在主题中添加句号。

比如:net/r8169: add PMD driver skeleton

3.2.2 主体

- 消息正文应描述正在修复的问题或正在添加的功能
- 当更改显而易见时,除签名外,正文可以为空白。
- 提交消息必须以 Signed-off-by: 行结尾,该行使用以下命令添加:
git commit --signoff # 或 –s
- 签名必须是真实姓名,而不是别名或昵称。允许多个签名。
- 提交消息的文本应在 72 个字符内换行。

3.3 生成和检查 patch

可以直接从 git 发送补丁,但对于新贡献者,建议使用 git format-patch 生成补丁,然后当一切正常并且补丁已经过检查时,使用 git send-email 发送它们。

# Generate a patch from the last 3 commits.
git format-patch -3
# Add a prefix with a version number.
git format-patch -3 -v 2
# check these patches
./scripts/checkpatch.pl --no-tree xxx.patch

一些基本的诸如 git add . 和 git commit命令就不做赘述了,这里我们着重介绍一下git rebase。我本人对这个命令的应用也仅限于个人使用到的场景,并没有那么精通,不过抛砖引玉,和大家分享一下倒是无所谓。

比如你的仓库下有四个提交,然后你想修改第一个提交。你可以用下面的命令,然后得到下面的界面。

git rebase -i HEAD~4

pick   commitID_1   commit log 1

pick   commitID_2   commit log 2

pick   commitID_3   commit log 3

pick   commitID_4   commit log 4

第二步,将第一个pick修改为edit,然后退出。这样你就到了commit 1,你可以做修改,然后正常 git add,注意git commit要加上--amend,然后你需要执行

git rebase –continue

这样,如果没有冲突的话,那就完成了。

但是有时候不会这么顺利,那么就需要打开冲突的文件然后fix。在fix后,先git add,然后记得不要做git commit,直接继续执行git rebase --continue。如下图所示,图1是修改前,图2是遇到冲突了。

图1 修改前的commit们

图2 rebase到C后遇到冲突

这里为什么强调不要做git commit呢?因为我因此丢了一个commit。原理其实很简单,你第一次git rebase,然后做git commit --amend,这是在修改最近的一次提交,然后git rebase --continue。但是,在你发生冲突的时候,它其实是需要解决冲突然后继续rebase的,并不是要去修改最近的一次提交。也许有些绕口,这理解也有很多个人的理解,如果我的描述有问题,也欢迎交流。所以这时候,你如果使用了git commit,你就会把两个commit合成一个,也就会丢掉一个commit。如下图所示。

图3 B和C合成了一个patch

这时候我们该怎么做呢?如果我们没有做rebase,那么可以先把BC'的内容换成B'然后继续git amend后git rebase。这样就会变成只少了一个C'。然后呢,我们继续git rebase,切换到B'后,git add并git commit C',把它加入,之后git rebase即可。如下图,

图4 修复策略一

但是如果不巧,你已经rebase完成了,那么就需要再次rebase,先切到BC',然后先git commit --amend,把B'改好,然后再git add并git commit C',之后git rebase。

图5 修复策略二

3.4 发送patch

首先需要编辑.gitconfig。主要是name、email、serverport、server等。

然后就可以发送patch了,这时候如果生成了patch,那么就可以

git send-email --to xxx A.patch B.patch C.patch

如果没有生成patch就可以通过下面的命令,这样一下子就可以发送最近的三个patch上去,当然,最好加上封面信的option。

git send-email --to xxx -3 --cover-letter --annotate --subject-prefix 'PATCH v1'

至此,patch就已经发送出去了。

3.5 修改patch

patch发送出去后,maintainer会提供修改意见给你,然后你们可以通过邮件交流,在通过上述的步骤一次又一次修改和上传后,你的代码就会被merge进去。

4 总结语

这次上传经历也是我作为maintainer的开始,记录一下这个过程与大家分享。

如果觉得这篇文章有用的话,可以点赞、评论或者收藏,万分感谢,goodbye~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运费微服务和redis存热点数据

目录 运费模板微服务 接收前端发送的模板实体类 插入数据时使用的entity类对象 BaseEntity类 查询运费模板服务 新增和修改运费模块 整体流程 代码实现 运费计算 整体流程 总的代码 查找运费模板方法 计算重量方法 Redis存入热点数据 1.从nacos导入共享redis配置…

如何在windows10上部署WebDAV服务并通过内网穿透实现公网分享内部公共文件

WebDAV&#xff08;Web-based Distributed Authoring and Versioning&#xff09;是一种基于HTTP协议的应用层网络协议&#xff0c;它允许用户通过互联网进行文件的编辑和管理。这意味着&#xff0c;无论员工身处何地&#xff0c;只要连接到互联网&#xff0c;就能访问、编辑和…

gRPC 快速入门 — SpringBoot 实现(1)

目录 一、什么是 RPC 框架 &#xff1f; 二、什么是 gRPC 框架 &#xff1f; 三、传统 RPC 与 gRPC 对比 四、gRPC 的优势和适用场景 五、gRPC 在分布式系统中应用场景 六、什么是 Protocol Buffers&#xff08;ProtoBuf&#xff09;&#xff1f; 特点 使用场景 简单的…

深入浅出:SOME/IP-SD的工作原理与应用

目录 往期推荐 相关缩略语 SOME/IP 协议概述 协议介绍 SOME/IP TP 模块概述和 BSW 模块依赖性 原始 SOME/IP 消息的Header格式 SOME/IP-SD 模块概述 模块介绍 BSW modules依赖 客户端-服务器通信示例 Message 结构 用于SD服务的BSWM状态处理 往期推荐 ETAS工具…

字节高频算法面试题:小于 n 的最大数

问题描述&#xff08;感觉n的位数需要大于等于2&#xff0c;因为n的位数1的话会有点问题&#xff0c;“且无重复”是指nums中存在重复&#xff0c;但是最后返回的小于n最大数是可以重复使用nums中的元素的&#xff09;&#xff1a; 思路&#xff1a; 先对nums倒序排序 暴力回…

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…

在 Windows 11 WSL (Ubuntu 24.04.1 LTS) | Python 3.12.x 下部署密码学库 charm

1. 在 Windows 11 上部署 Ubuntu (WSL) 由于作者没有高性能的 Ubuntu 服务器或个人电脑&#xff0c;且公司或学校提供的 Ubuntu 服务器虽然提供高性能 GPU 等硬件配置但通常不会提供 root 权限&#xff0c;因而作者通过在搭载了 Windows 11 的个人电脑上启动 Ubuntu (WSL) 来进…

【中间件开发】Redis基础命令详解及概念介绍

文章目录 前言一、Redis相关命令详解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式锁的实现1.3 lua脚本解决ACID原子性1.4 Redis事务的ACID性质分析 二、Redis协议与异步方式2.1 Redis协议解析2.1.1 redis pipeline…

设计模式的艺术读书笔记

设计模式的艺术 面向对象设计原则概述单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 创建的艺术创建型模式单例模式饿汉式单例与懒汉式单例的讨论通过静态内部类实现的更好办法 简单工厂模式工厂方法模式重载的工厂方法工厂方法的隐藏工厂方…

计算机毕设-基于springboot的甜品店管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…

【开源免费】基于Vue和SpringBoot的课程答疑系统(附论文)

博主说明&#xff1a;本文项目编号 T 070 &#xff0c;文末自助获取源码 \color{red}{T070&#xff0c;文末自助获取源码} T070&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

ACM latex模板中的CCSXML (即:CCS Concept)怎么填?

CCS Concept 感谢CCS Concept 怎么填 的珠玉在前. 问题描述 如下&#xff0c;ACM模板&#xff08;比如ACM computing surveys&#xff09;有一段是需要填写 ccsxml&#xff1a; %% %% The code below is generated by the tool at [http://dl.acm.org/ccs.cfm.](http://dl.…

【Transformer序列预测】Pytorch中构建Transformer对序列进行预测源代码

Python&#xff0c;Pytorch中构建Transformer进行序列预测源程序。包含所有的源代码和数据&#xff0c;程序能够一键运行。此程序是完整的Transformer&#xff0c;即使用了Encoder、Decoder和Embedding所有模块。源程序是用jupyterLab所写&#xff0c;建议分块运行。也整理了.p…

Mybatis-plus 简单使用,mybatis-plus 分页模糊查询报500 的错

一、mybtis-plus配置下载 MyBatis-Plus 是一个 Mybatis 增强版工具&#xff0c;在 MyBatis 上扩充了其他功能没有改变其基本功能&#xff0c;为了简化开发提交效率而存在。 具体的介绍请参见官方文档。 官网文档地址&#xff1a;mybatis-plus 添加mybatis-plus依赖 <depe…

前端项目使用gitlab-cicd+docker实现自动化部署

GitLab CI/CD 是一个强大的工具&#xff0c;可以实现项目的自动化部署流程&#xff0c;从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker&#xff1f; 目前我们公司开发环境使用的shell脚本部署&#…

设计模式:20、状态模式(状态对象)

目录 0、定义 1、状态模式的三种角色 2、状态模式的UML类图 3、示例代码 0、定义 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 1、状态模式的三种角色 环境&#xff08;Context&#xff09;&#xff1a;环境是一个类&#xff0…

Unity3D学习FPS游戏(13)玩家血量控制

玩家血量控制 血条UI玩家Canvas下的Slider血量逻辑控制 子弹攻击掉血子弹发射者的区分玩家受伤逻辑子弹碰撞检测 效果 血条UI 和之前我们前面介绍的玩家武器弹夹UI的思路是一样的&#xff0c;跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。 玩家Canvas下的Slider 之前玩…

【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 075 &#xff0c;文末自助获取源码 \color{red}{T075&#xff0c;文末自助获取源码} T075&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

学在西电录播课使用python下载,通过解析m3u8协议、多线程下载ts视频块以及ffmpeg合并

本文涵盖的内容仅供个人学习使用&#xff0c;如果侵犯学校权利&#xff0c;麻烦联系我删除。 初衷 研究生必修选逃&#xff0c; 期末复习怕漏过重点题目&#xff0c;但是看学在西电的录播回放课一卡一卡的&#xff0c;于是想在空余时间一个个下载下来&#xff0c;然后到时候就…