在应用补丁之前是否可以知道文件是否已经打过补丁?
我需要在脚本中执行此操作,有什么想法吗?
答案1
是的,只需patch
使用--dry-run
选项运行,它要么会失败,要么会成功,这可以通过其退出状态找到。
但以更通用(且不易出错)的方式,您可能必须使用-R
意味着“反向”的选项来运行它,因为只有当它能够恢复整个补丁时,它才可以被视为“已应用”。否则(没有“-R”)它可能会因为原始文件的某些部分被更改而失败。下面是一个简单的例子:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(甚至,在上面的代码片段中,您甚至可能更喜欢完全静音,patch
将其 stdout 和 stderr 重定向到/dev/null
)
答案2
以防万一它对某人有帮助,如果您使用的是 bash 脚本,那么 Omnifarious 给出的示例将不起作用。在 bash 中,成功命令的退出状态为 0
所以下面的方法会起作用:
patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
#apply the patch
patch -p0 -N < patchfile
fi
答案3
这是一个猜测,假设您正在使用该patch
实用程序并且每个要修补的文件都有自己的补丁:
if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
echo The file has not had the patch applied,
echo and the patch will apply cleanly.
else
echo The file may not have had the patch applied.
echo Or maybe the patch doesn't apply to the file.
fi
答案4
这对我有用。
"scripts": {
"symfony-scripts": [
"patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",