混帐difftool,立即打开所有差异文件,而不是串行

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

我正在寻找一种方法来一次打开所有的文件 – 在BeyondCompare比如这将打开在同一个BC窗口内的标签中的所有文件。

这样可以更容易地查看一组复杂的变化; 在diff文件之间前后翻转,忽略不重要的文件。

git v1.7.11开始,你可以使用git difftool --dir-diff来执行目录diff。

下面的答案适用于v1.7.11之前的git安装。


在git邮件列表上提出了同样的问题。

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

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

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

这里是项目描述:

git-diffall脚本为git提供了一个基于目录的diff机制。 该脚本依靠diff.toolconfiguration选项来确定使用什么差异查看器。

这个脚本与所有用来指定一系列修改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> :显示包含第二个分支的变化,从共同的祖先开始,

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

该脚本基于Thomas Rast在Git列表中提供的示例 。

这就是我所定下的…

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

 #!/bin/sh git diff --name-only "$@" | while read filename; do git difftool "$@" --no-prompt "$filename" & done 

将文件放在你的git安装目录的cmd文件夹中(例如C:\Program Files (x86)\Git\cmd

和你一样使用git diff

 git diffall git diffall HEAD git diffall --cached git diffall rev1..rev2 etc... 

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

如果你在源代码pipe理下(Git,Mercurial,Subversion,Bazaar等等)给它一个目录,它会自动列出所有更改的文件,你可以双击来查看个体差异。

国际海事组织键入meld .要容易得多meld . 并找出configurationVCS启动meld的VCS。 另外,无论您的项目使用什么VCS,您都可以使用相同的命令,如果您在两者之间进行切换,这是非常棒的。

唯一的缺点是,融合扫描更改比从git / hg / svn传递更改要慢,但是否足够慢是一个问题将取决于您如何使用它我确信。

我find了这种方法 (GitDiff.bat和GitDiff.rb),将文件复制到旧的/新的临时目录,然后对它们进行文件夹比较。

但我宁愿直接查看工作文件(来自工作目录),因为BeyondCompare具有可以在diff窗口内编辑文件的便利function,这对于快速清理非常有用。

编辑: 类似的方法在这里回应我的问题在git邮件列表。

注意到 Araxis Merge有一个“-nowait”命令选项:

-nowait防止比较等待比较被closures

也许这返回一个立即退出代码,将工作,任何人都经历过这个? 找不到类似的选项BeyondCompare …

如果您只想打开当前修改的所有文件,请尝试如下所示:

 vi $(git status | sed -n'/.*modified:* / s /// p')

如果您提交了“复杂的变更集”,则可能需要重新考虑您的工作stream程。 git的一个非常好的function是它使开发人员可以轻松地将复杂的变更集简化为一系列简单的修补程序。 而不是试图编辑当前修改的所有文件,您可能需要查看

  git add --patch 

这将允许你有select地阶段大块头。

我写了一个PowerShell脚本,将复制两个工作树,并与DiffMerge进行比较。 所以你可以这样做:

 GitNdiff master~3 . 

例如,比较前三个主分支与当前工作树。

它的shiny和新的,可能充满了错误。 一个缺点是工作树中尚未添加的文件被拷贝到两个工作树上。 它也可能很慢。

http://github.com/fschwiet/GitNdiff

对于那些有兴趣在Araxis上使用Mac OS X上的git-diffall,我在github上分叉了git-diffall项目,并添加了一个包装了Araxis Merge命令的AppleScript。 注意:这是araxisgitdiff文件的轻微修改的克隆,随Araxis Merge for Mac OS X提供。

https://github.com/sorens/git-diffall

弥漫也有VCS集成。 它可以与其他VCS交互使用,包括SVN,Mercurial,Bazaar等等。对Git来说,如果有一些但不是全部的变化,它甚至会显示三个窗格。 在冲突的情况下,甚至会有四个窗格。

漫画与分阶段和非持续的编辑截图

用它来调用它

 diffuse -m 

在你的Git工作副本中。

如果你问我,我已经看了十年的最好的视觉差异。 (我也尝试过融合。)

您可以使用gitk,同时查看所有的差异