我非常喜欢 git diff 的输出格式,我经常用它来git diff --no-index
比较任意与 git 无关的文件。但据我所知,使用 --no-index 时只能提供一对文件。我真的很想能够传递多对文件,例如:
git diff --no-index a.new a.old b.new b.old
git diff
并获得在 repo 中运行所得到的输出类型:
diff --git a/a b/a
index e965047..ce01362 100644
--- a/a
+++ b/a
@@ -1 +1 @@
-Hello
+hello
diff --git a/b b/b
index 2b60207..dd7e1c6 100644
--- a/b
+++ b/b
@@ -1 +1 @@
-Goodbye
+goodbye
有没有办法用 git diff 或者类似的工具来做到这一点?
答案1
由于git diff --no-index
还接受两个目录并对其进行比较,因此您可以随时围绕该目录编写一个包装脚本,将文件复制到两个临时目录中。
除此之外,我不知道有哪个 diff 工具可以接受多对文件进行比较。甚至diff
只接受一对文件,或者一个目录和一个文件列表。
答案2
这基本上是两个上下文相关的版本Jaap 的回答为git diff --no-index
,附加额外颜色建议。
移动线条的特殊颜色
在运行之前git diff --no-index
,你可能需要设置diff.colorMoved
在 Git 配置中。或者,您可以包含一个--color-moved
选项,而不是全局设置。
diff.colorMoved
当从某个位置移除的线条出现在 diff 中的其他地方时,设置会使用不同的线条颜色。无论它们是否移动到之内文件或他们移动至另一个文件,就像重构一样。
我对颜色选择非常满意dimmed-zebra
。
diff
两种情况
完整或几乎完整的套装
目录中有一些文件current-version
,你想将它们与其他文件进行比较。如果你想要比较的文件集new-version
在内容上几乎相同,只需使用Jaap 的建议:
git diff --no-index current-version/ new-version/
要比较的特定文件
如果一个版本中只有少量文件,而另一个版本中却有很多文件,就像这样……
┌ current-project
| ├ (various folders)
| └ src
| ├ (various files)
| ├ foo.c
| └ bar.c
└ proposed-replacements
├ new-foo.c
└ new-bar.c
...您可以尝试让 Git 的重命名检测1完成这项工作。
您不想看到 中的大部分文件“丢失” proposed-replacements
。您不想费力地为proposed-replacements
' 文件赋予与 中相同的名称/路径current-project
,因此您将它们保留在原处并添加仅包含重命名和修改的文件的过滤器。
git diff --no-index --diff-filter=RM current-project/ proposed-replacements/
diff --git a/current-project/src/foo.c b/proposed-replacements/new-foo.c
similarity index 65%
rename from current-project/src/foo.c
rename to proposed-replacements/new-foo.c
index dd51990..64445b1 100644
--- a/current-project/src/foo.c
+++ b/proposed-replacements/new-foo.c
@@ -1,4 +1,4 @@
octopus
cow
-dog
tiger
+flamingo
diff --git a/current-project/src/bar.c b/proposed-replacements/new-bar.c
similarity index 87%
rename from current-project/src/bar.c
rename to proposed-replacements/new-bar.c
...
默认重命名检测是当文件与旧版本有 50% 以上的相似性时。您可以使用--find-renames=40%
或类似方法进行调整。请参阅文档了解更多信息。
1 我不知道哪个版本的 Git 添加了执行此操作所需的重命名跟踪程度。我使用的是 v2.18,但一些选项至少可以追溯到 2005 年。此外,我所做的测试是在一组非常简单的文件上进行的。