Git Diff Filenames

Git

~/.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"

此时,无论是直接在终端复制这个文件名,还是直接点击文件名跳转打开,都比较容易。

(来源:tweet from @brandur

需要注意的一点是,如果配置了 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 文档