代码拉取完成,页面将自动刷新
同步操作将从 deepinwiki/wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
有时候我们想更新某个文件夹,但是又知道新旧版本之间,实际变化并不大,这时候就可以考虑补丁技术。
制作补丁用的是diff命令:
# -r 递归文件夹
# -u 用统一格式
# --unidirectional-new-file 当新版有,旧版没,创建。当旧版有,新版无,忽略(用于制作部分更新的补丁)
# -N 新版有,创建,新版无,设置为空文件(用于制作完全一致的镜像补丁)
# a 旧文件夹,假设存在 x,y
# b 新文件夹, 假设存在 y,z
# 输出补丁文件 b.patch
diff -ru --unidirectional-new-file a b >b.patch
# 注意理解补丁文件的基本原理
# 旧a/y 新b/y
# +增加的内容
# -删除的内容
# 因此,更新补丁实质保留了一份原始的数据,并添加了一份新的数据,而相同的即忽略(但不管是更新后还是更新前的文件都存在这些数据)。因此可以通过补丁文件来反向操作,取消补丁
# new 是修改后的文件
# old 是原版
# -p 是输出修改的函数(源文件)
# -u 是统一格式
diff -up old new > old.patch
补丁的应用和卸载使用patch 命令:
# 一、安装补丁
# 如,当前路径/home
# -p0 表示对补丁文件里面的 a/* 操作,即操作/home/a/*
# -p1 表示对 * 操作,也就是去除一层路径前缀,即操作/home/*
# -i 补丁文件
patch -p0 -i b.patch
# 更好的做法,为啥?等下就知道
cd ./a
patch -p1 -i ../b.patch
# 二、卸载补丁
# -R 增加变删除,删除变增加
patch -R -p1 -i ../b.patch
为何要进入第一层目录打补丁:
#如果是p0,空文件将会变成对b/*操作,而不是对a/*操作,这点patch程序相当死板(不知道是不是bug)
# 因此,制作补丁文件应遵从如下规则:
# 1. a b 路径对称,且简单,不要 i/o/a , p/b 这种,因为路径会被记录进补丁文件
# 2. 进入 a 来并去除前缀操作打补丁。
# 3. 单个文件的补丁,不用这么严格
# 如例子:
ln -sr /lib/x86_64-linux-gnu original
ln -sr glibc/lib updated
diff -u --unidirectional-new-file original updated >glibc.patch
cd original
patch -p1 -i /home/glibc.patch #为系统的glibc打补丁
patch -R -p1 -i /home/glibc.patch #取消补丁
# 对当前目录下的文件应用补丁
# -i : --input
patch -i old.patch
# 卸载补丁(恢复原样)
# -R : --reverse
patch -Ri old.patch
# -a 二进制文件默认忽略,a参数添加它,但是出来的文件会非常大
diff -au /bin/ls a/x > ls.patch
# 全镜像补丁,添加N
diff -aNru a b > full.patch
glibc 是很底层的库,如果升级失败,后果严重,因此使用补丁,失败也能够取消补丁来回退。
# 创建路径快捷方式
mkdir glibc
cd glibc
ln -rs /opt/glibc/bin bin
ln -rs /usr/bin obin
ln -rs /opt/glibc/lib lib
ln -rs /usr/lib/x86_64-linux-gnu olib
ln -rs /opt/glibc glibc-exclude
ln -rs /usr/ oglibc
# 建立补丁
diff -au --unidirectional-new-file obin bin >bin.patch
diff -au --unidirectional-new-file olib lib > lib.patch
# -x 排除文件或文件夹
diff -aur --unidirectional-new-file -x "bin" -x "lib" oglibc glibc-exclude > glibc-exclude.patch
# 打补丁
su #进入管理员模式
glibc=$(pwd) #保存当前路径
pushd obin; patch -p1 -i $glibc/bin.patch; popd;
pushd olib; patch -p1 -i $glibc/lib.patch; popd;
pushd oglibc; patch -p1 -i $glibc/glibc-exclude; popd;
# 如果失败
pushd obin; patch -R -p1 -i $glibc/bin.patch; popd;
pushd olib; patch -R -p1 -i $glibc/lib.patch; popd;
pushd oglibc; patch -R -p1 -i $glibc/glibc-exclude; popd;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。