git difftool,立即打开所有diff文件,而不是串行打开

Seb*_*rth 229 git difftool

默认的git diff行为是以串行方式打开每个diff文件(等待先前文件在打开下一个文件之前关闭).

我正在寻找一种方法来同时打开所有文件 - 例如,在BeyondCompare中,这将打开同一BC窗口中选项卡中的所有文件.

这样可以更轻松地查看一组复杂的变化; 在diff文件之间向后和向前翻转并忽略不重要的文件.

Tim*_*gan 204

gitv1.7.11 开始,您可以使用它git difftool --dir-diff来执行目录差异.

例如,此功能适用于Meld 3.14.2,并允许您浏览所有已修改的文件:

git difftool --dir-diff --tool=meld HEAD~ HEAD
Run Code Online (Sandbox Code Playgroud)

这是一个方便的Bash功能:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)
Run Code Online (Sandbox Code Playgroud)

以下答案适用于git早于v1.7.11的安装.


git邮件列表上询问了同样的问题.

我将基于该电子邮件线程的shell脚本放在一起,该脚本在任意提交之间执行目录差异.

从git v1.7.10开始,该git-diffall脚本包含在contrib标准git安装中.

对于v1.7.10之前的版本,您可以从GitHub上git-diffall项目安装.

这是项目描述:

git-diffall脚本为git提供了一个基于目录的diff机制.该脚本依赖于diff.tool配置选项来确定使用的diff查看器.

此脚本与用于指定diff的一系列修订的所有表单兼容:

1)git diffall:显示工作树和分阶段更改之间的差异
2)git diffall --cached [<commit>]:显示分阶段更改和HEAD (或其他命名提交)之间的差异
3)git diffall <commit>:显示工作树和命名提交之间的差异
4)git diffall <commit> <commit>:显示两个命名提交之间的差异
5)git diffall <commit>..<commit>:相同如上所述
6)git diffall <commit>...<commit>:显示包含和最多为第二个的分支上的更改,从两者的共同祖先开始<commit>

注意:所有表单都采用可选的路径限制器 [--] [<path>]

此脚本基于Thomas Rast在Git列表中提供示例.

  • **更新**(关于`git difftool --dir-diff`和Beyond Compare):我联系了Scooter Software(Beyond Compare的作者),他们说`bcompare.exe`不是支持的解决方案,可能会导致问题如果一次打开多个差异.他们计划在未来的版本中将文件夹差异的支持添加到`bcomp.exe`(与此同时,我将继续使用`bcompare.exe`作为不支持的变通方法). (6认同)
  • 我非常感谢你的剧本.坦率地说,我无法理解为什么Git在这方面没有表现出正确的方式(Mercurial确实如此,多年来一直这样做),我也不能理解Git社区缺乏兴趣. (5认同)
  • @coin我刚刚使用Beyond Compare 4进行测试,而--dir-diff似乎可以使用支持的bcomp.exe. (4认同)
  • 只是评论说`--dir-diff`与Meld完美配合.从那里,它将允许您选择和查看单个文件的差异. (4认同)

Seb*_*rth 60

这就是我所确定的......

将以下代码复制到名为git-diffall(无扩展名)的文件中:

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done
Run Code Online (Sandbox Code Playgroud)

将文件放在cmdgit install目录的文件夹中(例如C:\Program Files (x86)\Git\cmd)

像你一样使用git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...
Run Code Online (Sandbox Code Playgroud)

注意:它的关键是& param,它告诉外部diff命令在后台任务中运行,以便立即处理文件.在BeyondCompare的情况下,这将打开一个屏幕,每个文件都在其自己的选项卡中.

  • 为了在 Linux 上使用 Git 2.x,我必须稍作修改:将 `"$filename"` 更改为 `"../$filename"`。然后它与 Beyond Compare 完美配合 (2认同)
  • 将`git-diffall`文件添加到`C:\Program Files\Git\cmd`文件夹后是否需要重启windows?我完全按照指示做了,但是在执行 `$ git diffall git: 'diffall' 不是一个 git 命令。参见'git --help'。你是这个意思吗?差异工具` (2认同)

Tom*_*Tom 18

meld 有一个简洁的功能,如果您在源代码管理下给它一个目录(Git,Mercurial,Subversion,Bazaar和其他可能),它将自动列出所有已更改的文件,您可以双击查看个别差异.

IMO它更容易输入meld .并让它弄清楚VCS而不是配置你的VCS启动meld.另外,无论您的项目使用什么VCS,您都可以使用相同的命令,如果您在它们之间进行大量切换,那就太棒了.

唯一的缺点是,扫描变化的速度要慢于传递git/hg/svn的变化,但是它是否足够缓慢是一个问题将取决于你如何使用它我敢肯定.

  • 对我来说,主要缺点是meld(无论出于何种原因)在新窗口中打开diff而不是新选项卡,在关闭diff后,工作目录中的文件将在新选项卡中打开,之前会显示恼人的弹出消息. (4认同)