(git) diff 输出相对路径是什么?

37

我需要获取存储库中与存储库基础不相关,而是相对于给定基础或给定路径的一些差异。

默认情况下,我会得到:

git diff
diff --git a/path/to/file b/path/to/file
index 0cc125e..9bf911e 100644
--- a/path/to/file
+++ b/path/to/file

但是我的需求是像这样的:

git diff --prefix=/new/path/to
diff --git a/new/path/to/file b/new/path/to/file
index 0cc125e..9bf911e 100644
--- a/new/path/to/file
+++ b/new/path/to/file

我已经查看了--relative选项(不是我要找的),--src/dst-prefix(这些只能更改“a”或“b”部分)。我是否漏掉了一些基本的东西?


它们都与存储库的某个部分相关吗?如果不是,为什么不使用vimdiff或meld呢? - Anshul Goyal
2个回答

40

git diff 打印出从仓库根目录开始的路径(有变更的文件) - 无论您执行命令时在哪里。

git diff --relative 将打印从当前目录开始的路径。

所以,如果您需要不从仓库根目录开始的路径,请移动到目录(在您的仓库树中)下降(cd),以使您的路径从该目录开始。


4
当我使用 git diff --name-only 时,“--relative”正是我所需要的,谢谢。 - Lilás
18
--relative 排除当前目录外的更改。 - Andy Stewart
你可以通过 git config --global diff.relative true 命令将相对路径设置为所有存储库的默认值;如果只想在当前存储库中使用,请省略 --global 参数。 - Robert
@Andy Stewart 是的,即使你明确给出一个当前目录之外的目录,例如使用 .. 表示父目录或者 :/ 表示工作树根目录,它也会将它们排除在外。 - ak2

21

看起来 --src-prefix--dst-prefix 就是 你要求的:

$ cd .../git/builtin
$ ed - var.c << end
> 0a
> xxx
> .
> wq
> end
$ git diff
diff --git a/builtin/var.c b/builtin/var.c
index aedbb53..5210013 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -1,3 +1,4 @@
+xxx
 /*
  * GIT - The information manager from hell
  *

(到目前为止,还比较标准;现在:)

$ git diff --src-prefix=a/new/ --dst-prefix=b/new/
diff --git a/new/builtin/var.c b/new/builtin/var.c
index aedbb53..5210013 100644
--- a/new/builtin/var.c
+++ b/new/builtin/var.c
@@ -1,3 +1,4 @@
+xxx
 /*
  * GIT - The information manager from hell
  *

你可以将此与--relative结合使用:

$ git diff --relative --src-prefix=a/new/ --dst-prefix=b/new/
diff --git a/new/var.c b/new/var.c
index aedbb53..5210013 100644
--- a/new/var.c
+++ b/new/var.c
@@ -1,3 +1,4 @@
+xxx
 /*
  * GIT - The information manager from hell
  *
$ 

我认为这是正确的,当然我从来没有想过尝试它们两个..我讨厌移植补丁。 - user318904
1
你似乎对git有深入的了解(我读了一些你的回答)。你有什么资源可以推荐吗? - Antarctica
3
@南极洲:我已经使用Git十多年了,并最近稍微做出了一些贡献。目前,我没有任何特别推荐的单一建议,但如果你正在寻找一本关于Git的好书,Pro Git book 是一个不错的选择:它在线上并持续更新,而且它是免费的,其内容也是正确的(不像很多线上教程)。另外还有 Think Like (a) Git,它涵盖了大部分 Pro Git 没有提到的内容。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接