2009-08-03 123 views
190

默认的git diff行为是以串行方式打开每个diff文件(在打开下一个文件之前等待先前的文件关闭)。git difftool,立即打开所有diff文件,不是连续打印

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

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

+0

“git diff”或“git difftool”?您可能想要发布请求(对所有人开放,并使用varous web界面)git邮件列表:[email protected] – 2009-08-03 10:10:43

+0

我使用“git difftool”来触发外部差异应用程序。感谢邮件列表的想法。 – 2009-08-04 03:28:15

+0

这将有助于了解该平台。在基于Unix的平台上,我会编写一个脚本来执行diff并指示git使用该脚本。在脚本中,我只是在后台运行diff,然后让脚本死掉。 – 2009-08-06 16:33:30

回答

53

这是我看中了...

将以下代码复制到一个文件名为git-diffall(没有扩展名):

#!/bin/sh 
git diff --name-only "[email protected]" | while read filename; do 
    git difftool "[email protected]" --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的情况下,每个文件在其自己的选项卡中打开一个屏幕。

+0

感谢张贴。 Unfortunatley,它不适用于WinMerge的-s选项。在WinMerge查看它们之前,除第一个以外的所有临时文件都会被删除。 – 2010-04-19 16:24:57

3

我确实发现this method(GitDiff.bat和GitDiff.rb)将文件复制到老/新临时目录,然后对它们进行文件夹比较。

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

编辑:a similar method here回应我在git邮件列表上的问题。

1

Noticed here是Araxis合并具有“-nowait”命令选项:

-nowait防止等待一个比较封闭

也许这将返回立即退出代码,并会比较工作,任何人都经历过这个?无法找到BeyondCompare类似选项...

0

您可以使用gitk,看看在同一时间

+3

是的,我发现gitk有用,但谈到差异BC是我想看到:) – 2009-08-13 01:00:50

1

如果你想要做的就是打开所有当前修改的文件中的所有分歧,尝试一些如:

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

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

git add --patch
,这将允许您选择阶段性的区块。

152

git v1.7开始。11,你可以使用git difftool --dir-diff执行一个目录diff。

下面的答案适用于git之前的版本v1.7.11。


git mail list询问同样的问题。

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

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

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

以下是项目介绍:

的混帐diffall脚本提供了 基于目录的DIFF机制 饭桶。该脚本依赖 diff.tool配置选项来确定使用什么差异查看器。

该脚本是与用于指定一个范围的 修订DIFF所有 形式兼容:

1)git diffall:显示 之间差异工作树和分阶段变化
2)git diffall --cached [<commit>]:显示 DIFF
3)git diffall <commit>上演的变化和HEAD 之间(或其他指定提交):显示 工作树之间的差异,并命名为提交
4)git diffall <commit> <commit>:显示DIFF两个命名之间 提交
5)git diffall <commit>..<commit>:上述
6)git diffall <commit>...<commit>相同 :显示在包含分支并到达 第二变化 ,起始于一个共同的 祖先两者的<commit>

注:所有形式的一个可选的路径 限制器[--] [<path>]

这个脚本是基于example provided by Thomas Rast on the Git list

1

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

GitNdiff master~3 . 

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

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

http://github.com/fschwiet/GitNdiff

17

meld有一个实用的功能,如果你给它一个目录源控制下(GIT,水银,颠覆,集市和可能其他人),它会自动列出所有修改过的文件,您可以双击查看个人差异。

IMO键入meld .要容易得多,并且找出VCS而不是配置VCS以启动meld。另外,无论您的项目碰巧使用哪种VCS,您都可以使用相同的命令,如果您在它们之间切换的次数很多,那么这很棒。

唯一的缺点是它是融合较慢的扫描变化比从git/hg/svn传递的变化,但它是否足够慢是一个问题将取决于你如何使用它我'当然。

1

对于那些有兴趣在Araxis上使用Mac OS X上的git-diffall,我在github上分配了git-diffall项目,并添加了一个包装Araxis Merge命令的AppleScript。注:这是araxisgitdiff文件略加修改克隆附带Araxis合并为Mac OS X.

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

2

Diffuse也有VCS集成。它与众多其他VCS交互操作,其中包括SVN,Mercurial,Bazaar,...对于Git,如果一些但不是全部变化都展示出来,它甚至会显示三个窗格。在冲突的情况下,甚至会有四个窗格。

Screenshot of diffuse with staged and unstaged edits

使用Git的工作副本与

diffuse -m 

调用它。

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