【问题标题】:git, vimdiff and dirdiffgit、vimdiff 和 dirdiff
【发布时间】:2011-11-16 18:07:00
【问题描述】:

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

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

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

有人知道vimdiff+dirdiff+git怎么用吗?

【问题讨论】:

标签: git vim vimdiff


【解决方案1】:

在 git 版本 1.7.11 之前

git-diffall 是我需要的,非常感谢。借助关于 git difftool 的 page 和关于从命令行运行 vim+dirdiff 的 one 的帮助,我将 $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 放入我的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

【讨论】:

  • +1 表示cmd。添加此评论而不是新答案,以便您可以使用以下信息更新此答案并接受它以供将来参考。正如@VonC 已经指出的那样,您现在可以使用git difftool -d 来区分整个目录。你的cmd 会直接让你进入vim 的DirDiff,一切都会按预期进行。您不再需要git-diffall,并且在使用-dgit difftool 时不需要prompt=false 配置行。
  • 注意:git diffall 正在为 git 2.0.X/2.1 删除:请参阅 stackoverflow.com/a/24979228/6309
【解决方案2】:

Tim Pope 的 fugitive 是 vim 的典型 git 插件。它可能没有 dirdiff 的功能,但它确实完美地集成了git status 输出,并带有键映射以在修改后的文件之间轻松导航。您的git status 输出中列出的任何文件都可以通过 D 映射轻松区分,允许您自定义更改的确切更改。

【讨论】:

  • 谢谢,我用逃犯做了一点实验,我会尽快尝试更多
【解决方案3】:

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

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

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

【讨论】:

【解决方案4】:

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

见“git difftool to give directory compare?

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

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

您只需:

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

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

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 调用)。
从头开始写一切更快

【讨论】:

  • 我的 aurum 具有类似 dirdiff 的功能(AuVimDiff full 打开一堆带有 vimdiff 视图的选项卡,其中包含有差异的文件)并且它从未使用任何类型的 difftool 支持。完成这项工作所需的只是 1.git diff --name-status 和 2.git cat-file,仅此而已(除了一些 vimscript 代码)。而且,与git difftool 不同,这适用于支持vcs diffvcs cat-file任何 VCS。
  • 目前逃犯不使用difftool做任何事情。
  • @ZyX:非常有趣。我在答案中包含了对您的 maurum 项目的引用以获得更多可见性。
  • 我不得不说,虽然你指出的脚本有效,但对于想要将此功能添加到逃犯的人来说,它并不是一个很好的指南:实际的 git diff --name-status 调用隐藏在 git 驱动程序中在s:git.status 调用的函数中以repo.functions.status 访问(因为mercurial 使用hg status -r rev1:rev2,而不是hg diff --name-status,我觉得这很合乎逻辑)。因此,您必须在这里遍历三个抽象级别(存储库接口、shell 命令包装器,然后才是实际的git 调用)。从头开始编写所有内容会更快。
  • @ZyX 了解。我已在答案中包含您的最后评论,以使其更加明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多