Starting with git
v1.7.11, you can use git difftool --dir-diff
to perform a directory diff.
This feature works well with Meld 3.14.2 for example, and lets you browse all modified files:
git difftool --dir-diff --tool=meld HEAD~ HEAD
This is a handy Bash function:
git-diff-meld() (
git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)
The answer that follows applies to git
installations older than v1.7.11.
This same question was asked on the git mail list.
I put together a shell script based on that email thread which performs a directory diff between arbitrary commits.
Starting with git v1.7.10, the git-diffall
script is included in the contrib
of the standard git installation.
For versions before v1.7.10, you can install from the git-diffall
project on GitHub.
Here is the project description:
The git-diffall script provides a directory based diff mechanism for git. The script relies on the diff.tool configuration option to determine what diff viewer is used.
This script is compatible with all the forms used to specify a range of revisions to diff:
1)
git diffall
: shows diff between working tree and staged changes
2)git diffall --cached [<commit>]
: shows diff between staged changes andHEAD
(or other named commit)
3)git diffall <commit>
: shows diff between working tree and named commit
4)git diffall <commit> <commit>
: show diff between two named commits
5)git diffall <commit>..<commit>
: same as above
6)git diffall <commit>...<commit>
: show the changes on the branch containing and up to the second , starting at a common ancestor of both<commit>
Note: all forms take an optional path limiter
[--] [<path>]
This script is based on an example provided by Thomas Rast on the Git list.
Here's what I settled on...
Copy the following code to a file called git-diffall
(no extension):
#!/bin/sh
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename" &
done
Place the file in the cmd
folder of your git install dir (eg C:\Program Files (x86)\Git\cmd
)
And use like you would git diff
:
git diffall
git diffall HEAD
git diffall --cached
git diffall rev1..rev2
etc...
Notes: The key to it is the & param which tells the external diff command to run in a background task so files are processed immediately. In the case of BeyondCompare this opens one screen with each file in its own tab.
meld
has a neat feature that if you give it a directory under source control (Git, Mercurial, Subversion, Bazaar and probably others) it will automatically list all the changed files and you can double-click to view the individual differences.
IMO it's much easier to type meld .
and have it figure out the VCS than configure your VCS to launch meld
. Plus you can use the same command no matter what VCS your project happens to be using, which is great if you switch between them a lot.
The only downside is it is slower for meld to scan for changes than to be passed the changes from git/hg/svn, though whether it's slow enough to be a problem will depend on how you're using it I'm sure.
I did find this method (GitDiff.bat and GitDiff.rb) that copies the files out to old/new temp dirs and then does a folder compare on them.
But I'd rather view the working files directly (from the working dir), as BeyondCompare has the handy feature of being able to edit the file from within the diff window which is great for quick cleanups.
Edit: a similar method here in response to my question on the git mailing list.
git meld
=> https://github.com/wmanley/git-meld is an awesome script which will open a neat diff of all the files in a single window.
Noticed here that Araxis Merge has a '-nowait' command option:
-nowait Prevents compare from waiting for a comparison to be closed
Maybe this returns an immediate exit code and would work, anyone experienced this? Can't find similar option for BeyondCompare...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With