在 ~/.gitconfig
中进行如下配置(或者使用命令:git config --global diff.noprefix true
):
[diff]
noprefix = true
之后,Git 输出的 diff 内容,比较的文件名前将不再包含 a/
和 b/
这样的前缀。
举例来说,在配置前,使用 git diff
命令,看到的输出可能如下:
diff --git a/package.json b/package.json
index ac6f0b2..f937b7b 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"bugs": {
"url": "https://github.com/laysent/some-codemod/issues"
},
- "version": "0.1.2",
+ "version": "0.2.0",
"license": "MIT",
"scripts": {
"test": "jest"
而进行了配置之后,输出如下:
diff --git package.json package.jsonindex ac6f0b2..f937b7b 100644
--- package.json
+++ package.json
@@ -13,7 +13,7 @@
"bugs": {
"url": "https://github.com/laysent/some-codemod/issues"
},
- "version": "0.1.2",
+ "version": "0.2.0",
"license": "MIT",
"scripts": {
"test": "jest"
此时,无论是直接在终端复制这个文件名,还是直接点击文件名跳转打开,都比较容易。
需要注意的一点是,如果配置了 noprefix
,那么在进行 git diff
创建 Patch 文件并通过 git apply
提交修改的时候,可能会遇到 Git 的报错:
error: git diff header lacks filename information when removing 1 leading pathname component (line 5)
原因就是生成的 Patch 文件,目录名称没有了前缀。针对这种情况,可以改用下面的方案进行 git apply
:
git apply -p0 change.patch
这里,-p0
表示 Git 在进行补丁操作的时候,需要先删除零层前缀字符,然后再读取真实的目录地址。这里,Git 会根据 /
字符将目录地址拆分开来,然后删除必要的层数,将剩下的部分作为文件地址。默认值是 1
,也就是会将 a/package.json
当作 package.json
目录进行处理。如果改成 -p2
,那么 a/dir/file
会被当成 file
目录进行处理。
相关的说明可以参考 Git 文档。