如何在Git仓库外使用git apply时避免--unsafe-paths参数?
问题场景与需求
我尝试应用git diff --no-index在两个未纳入Git仓库的相似目录树生成的补丁,由于补丁可能包含GNU patch不支持的文件重命名操作,只有添加--unsafe-paths参数后git apply才能正常工作,但我想避免使用这个参数,同时确保不会误改目标目录以外的文件。
以下是测试操作流程:
$ mkdir ~/test $ cd ~/test $ mkdir old $ echo old > old/file $ mkdir new $ echo new > new/file $ git diff --no-index old new > test.diff $ cat test.diff diff --git a/old/file b/new/file index 3367afd..3e75765 100644 --- a/old/file +++ b/new/file @@ -1 +1 @@ -old +new $ git apply -p2 --verbose --check ../test.diff Skipped patch 'file'. $ git apply -p2 --directory=old --verbose --check test.diff Skipped patch 'old/file'. $ git apply -p2 --directory=$PWD/old --verbose --check test.diff Skipped patch '/home/user/test/old/file'. $ cd /tmp $ git apply -p2 --directory=$HOME/test/old --verbose --check ~/test/test.diff Checking patch /home/user/test/old/file... error: invalid path '/home/user/test/old/file' $ cd ~/test $ git apply -p2 --directory=$HOME/test/old --verbose --check --unsafe-paths ~/test/test.diff Skipped patch '/home/user/test/old/file'. $ cd /tmp $ git apply -p2 --directory=$HOME/test/old --verbose --check --unsafe-paths ~/test/test.diff Checking patch /home/user/test/old/file...
问题总结
设置--directory参数,甚至切换到非目标目录前缀的路径执行命令,都会出现“Skipped patch”或“invalid path”错误。只有在/tmp目录(非目标目录前缀)下执行,同时指定--directory和--unsafe-paths参数的命令才能正常运行,但我不想依赖--unsafe-paths。
解决方案
方案1:调整补丁生成方式,用相对路径简化内容
生成补丁时添加--relative参数,去掉补丁路径中的old/和new/前缀,后续应用时无需复杂路径参数:
cd ~/test git diff --no-index --relative old new > test.diff
此时补丁内容变为:
diff --git a/file b/file index 3367afd..3e75765 100644 --- a/file +++ b/file @@ -1 +1 @@ -old +new
进入目标目录直接应用补丁:
cd old git apply ../test.diff --check
这种方式不需要--unsafe-paths,且只会修改old目录内的文件,不会影响外部路径。
方案2:用--prefix替代--directory调整路径
如果无法修改补丁生成方式,可通过--prefix配合-p参数调整路径层级,避免绝对路径和目录嵌套问题:
cd ~/test git apply -p2 --prefix=old/ --verbose --check test.diff
-p2:去掉补丁路径中a/old/和b/new/的前缀,得到基础文件名file--prefix=old/:给基础文件名加上目标目录前缀,最终路径为old/file,与实际文件路径匹配
这种方式同样无需--unsafe-paths,且严格限定修改范围在old目录内。
内容的提问来源于stack exchange,提问作者patraulea
相关产品推荐
相关产品推荐

