views:

243

answers:

4

I inherited a project originally stored in CVS with all the revisions. I made quite a few edits, and I'm trying to compare all the changes I made in the original directory, in regards to new files added versus the old ones.

Is there some sort of utility for hg/git where I can do a tree diff, or something of that nature? So that say, there's a mark between newly added files, deleted files, am I asking for too much?

+1  A: 

git diff does exactly that. but it only works for git projects.

hg diff, svn diff pretty every version control system can diff directory trees

knittl
Can you expand on how I can use `git diff`? I created two separate git projects, how can I compare them now? I'm still relatively new to VCSing.
meder
you only need one project. commit all your files, make your changes, commit again. you can then do `git diff HEAD^..HEAD`, which diffs your latest version against the one before it
knittl
Ok - I guess I got what I wanted because I'm seeing a ton of results, can you recommend a nice GUI?
meder
try `gitk` and `git gui`, gitk visualizes project history, git gui allows you to prepare commits and such
knittl
Actually `git diff` **can** compare arbitrary files/directories; you might need to use its `--no-index` option
Jakub Narębski
+2  A: 

It's not git-specific, but as a general diff utility for Windows, I really like WinMerge.

Andy West
+1  A: 

I don't really understand what you want, but isn't diff -ur enough for you? It will work even on directories without any kind of version control.

Thiago Arrais
+1  A: 

From git diff manpage:

git diff [--options] [--] [<path>...]

[...]
If exactly two paths are given, and at least one is untracked, compare the two files / directories. This behavior can be forced by --no-index.


If you want to compare two versions (e.g. two tagged releases, or two branches) in two different repositories, you can use trick described in GitTips page on Git Wiki, under "How to compare two local repositories".

Assuming that you are inside one repository, and second repository is in /path/to/repo, so its GIT_DIR is /path/to/repo/.git if it is non-bare repository, you can something like the following:

$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
   git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B

where A and B are revisions you want to compare. Of course you can also specify path limiter in above expression.

Explanation: GIT_ALTERNATE_OBJECT_REPOSITORIES variable can be used to make git commands concatenate object database of the two repositories. git --git-dir=... rev-parse ... is used to turn name (extended SHA-1 expression) in repository given as parameter to git-dir option into unique SHA-1 identifier. The $( ... ) construct puts result of calling given command in command line. git diff is used to compare two revisions (where one is from alternate object repository).

Alternate solution would be to simply import other repository into given repository, using git remote add (and git fetch). Then you would have everything locally, and would be able to do comparision inside single repository.

Jakub Narębski
yep thanks, ended up remote adding, fetching, diffing.
meder