用diff和patch生成补丁文件文件并建立git仓库

在阅读论文的时候用Git追踪改动

# 契机

现在有一份论文的开源内核代码,但是没有Git修改记录。我们希望阅读并修改之,并且用Git追踪这些修改。

25/07/24追加:如果你正打算自己修改内核并产生patch文件,建议使用git提供的相关功能如git diffgit format-patch。单纯使用diffpatch已经过时,详见讨论.

# 文件夹描述约定

本文假设我们在名为LinearKF的公共目录下进行操作,干净内核和修改过的内核放在这个目录下,分别是linux-5.15linux-srctree,patch文件也放在该目录下。

1
2
3
4
LinearKF
├── linux-5.15
├── linux-srctree
└── patch.p1

最终的Git仓库会建立在linux-5.15中。

# 生成patch文件

# 获取原生Linux内核

首先从Linux代码仓库里下载一份干净的代码,可以从Github或其它linux.git镜像站:

  1. Github;
  2. TUNA.

注意只需要clone一个特定tag(--branch v5.15)即可,可以使用下面的代码克隆不包含历史记录(--depth 1)的单一分支(--single-branch):

1
2
3
# Execute at folder `LinearKF`
git clone --depth 1 --single-branch --branch v5.15 \
        https://mirrors.tuna.tsinghua.edu.cn/git/linux.git linux-5.15

此时该仓库最后的Commit应该是Linus Torvalds打上的tag。

# 生成patch文件

回到公共目录,用下面代码^[https://www.kernel.org/doc/html/v4.17/process/submitting-patches.html]生成patch文件。

1
2
3
# Execute at folder `LinearKF`
diff -uprN -X linux/Documentation/dontdiff \
        linux-5.15 linux-srctree > patch.p1

其中-X指定了排除的文件(是的内核已经准备好了这个文件)。注意后面两个文件夹的书写顺序。

# 应用patch文件

# 应用patch文件

进入linux-5.15目录,执行下面代码以应用patch:

1
2
# Execute at folder `linux-5.15`
patch -p1 < ../patch.p1

其中-p1告诉patch指令,去掉patch文件中的第一个目录层级。

# 提交更改到git

通过上面方式获取的内核可以已经初始化了git仓库,于是直接在linux-5.15目录中提交修改就行。

1
2
git add .
git commit -m "your commit message"
Total Page View Loading
Total Visits: Loading  Site Total Visitors: Loading
Built with Hugo
Theme Stack designed by Jimmy