Git应用新文件Diff时报错:路径不在工作树中怎么解决?
解决Git新增文件应用差异时的歧义参数错误
这个问题我之前也碰到过!核心原因是:当文件是origin/master上新增的、本地master完全没有的文件时,git diff master..origin/master file_name这个命令本身就会报错——Git找不到本地的这个文件,所以输出的不是有效的补丁内容,传给git apply自然就会抛出「ambiguous argument」的错误了。
这里给你两种可行的解决思路,都能完美处理新增文件的情况:
方案一:先判断文件是否存在,分情况处理
修改你的脚本,先检查目标文件在本地master分支中是否存在,再分别执行不同的操作:
#!/bin/bash # 获取变更文件列表 files=$(git diff --name-only master..origin/master) for file in $files; do # 检查文件是否存在于本地master分支 if git rev-parse --verify master:"$file" >/dev/null 2>&1; then # 本地已存在,直接应用差异 git diff master..origin/master "$file" | git apply else # 本地不存在,直接从远程拉取文件内容 git show origin/master:"$file" > "$file" # 或者用补丁方式apply(效果一样): # git diff --no-index /dev/null <(git show origin/master:"$file") | git apply fi done
为什么这个方法有效?
git rev-parse --verify master:"$file"会尝试解析本地master分支中该文件的对象,不存在的话会返回非0值,我们用这个来判断文件是否是新增的。- 对于新增文件,直接用
git show origin/master:"$file"获取远程文件的内容,写入本地即可,比生成补丁再apply更直接。
方案二:改用git format-patch生成补丁再应用
如果你不想写判断逻辑,也可以用git format-patch来生成包含所有变更(包括新增文件)的补丁集,然后批量应用:
# 生成从master到origin/master的所有补丁,保存到patches目录 git format-patch -o patches master..origin/master # 批量应用所有补丁 git am patches/*.patch
这个方法更简洁,而且Git会自动处理新增文件、修改文件、删除文件等所有情况,不需要自己做分支判断。
小提示:如果应用补丁时出现冲突,
git am会自动暂停,你解决冲突后用git am --continue继续即可,非常方便。
内容的提问来源于stack exchange,提问作者ajfbiw.s
相关产品推荐
相关产品推荐

