23

我正在尝试使用 vimdiff+ dirdiff.vim在 Vim 中区分使用 Git 版本化的多个文件。

对于 Mercurial,可以使用mercurial extdiff扩展。

我在网上找到的将 Vim 与 Git diff 集成的唯一方法是在单个文件上使用 vimdiff,如本文所述。

有谁知道如何使用vimdiff+dirdiff+git?

4

4 回答 4

18

git 版本 1.7.11 之前

git-diffall是我需要的,非常感谢。在这个关于 git difftool的页面和这个关于从命令行运行 vim+dirdiff 的帮助下,我写了我$HOME/.gitconfig的:

[diff]
  tool = default-difftool

[difftool "default-difftool"]
  cmd = vim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)' $LOCAL $REMOTE

[difftool]
  prompt = false

放入 git-diffall my后PATH,我可以区分例如带有分支dev的工作目录:

git diffall dev

如果我想从 Vim 永久修改工作目录,这--copy-back也是我需要的:

git diffall --copy-back dev

自 git 版本 1.7.11

从1.7.11版本开始,“git difftool”学习了“--dir-diff”选项来简化事情并且git-diffall不再需要。

.gitconfig包含:

[diff]
  tool = default-difftool
[difftool "default-difftool"]
  cmd = vim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)' $LOCAL $REMOTE '+syntax off'

例如,使用分支区分工作目录dev是通过以下方式完成的:

git difftool -d dev
于 2011-11-17T08:13:05.563 回答
6

Tim Pope 的逃犯是 vim 的典型 git 插件。它可能没有 dirdiff 的功能,但它确实完美地集成git status了输出,通过键映射可以轻松地在修改后的文件之间导航。然后,您的输出中列出的任何文件git status都可以轻松地与D映射进行差异化,从而允许您自定义进入更改的确切更改。

于 2011-11-16T18:43:45.530 回答
2

监视Vim 模块 fugitive 的提交会很有趣,因为从(git 1.7.11,2012年 6 月)开始,git 现在可以区分目录(即在打开之前显示所有要比较的文件difftool

参见“git difftool给目录比较?

因此,添加该功能fugitive.vim将是从文件到文件差异方法的演变。

然而,Zyx在评论中指出了这种方法的局限性:

完成这项工作所需要做的就是:

  1. git diff --name-status
  2. git cat-file,

仅此而已(除了一些vimscript代码)。
而且,与 不同的是,这适用于任何支持git difftoolvcsdiff和 vcs的 VCScat-file

Zyx 提到了他的项目aurum的逐个文件方法的示例:

我的 aurum 具有类似 dirdiff 的功能(AuVimDiff full打开一堆选项卡以vimdiff查看有差异的文件),并且它从未使用任何类型的difftool支持。

(见脚本aurum / autoload / aurum / vimdiff.vim

Zyx 补充道:

对于想要将此功能添加到逃犯的人来说,它不是一个很好的指南:
实际git diff --name-status调用隐藏在 git 驱动程序中的一个由s:git.status访问为调用的函数中repo.functions.status(因为 mercurial 使用hg status -r rev1:rev2,而不是hg diff --name-status,我觉得这很合乎逻辑)。
因此,您必须在这里遍历三个抽象级别(存储库接口、shell 命令包装器以及只有实际的 git 调用)。
从头开始编写所有内容更快

于 2012-06-18T16:48:36.733 回答
2

Git 不直接支持目录差异,但可以通过 3rd 方扩展来完成。

签出git diffall(披露:我写了这个脚本)。此脚本与工具集一起使用git config diff.tool <TOOL>以执行真正的目录差异。

另外,请参阅以下相关问题:

于 2011-11-16T18:42:57.037 回答