Разница между двумя целыми каталогами/проектами в hg или git?

Я унаследовал проект, первоначально сохраненный в CVS со всеми версиями. Я сделал немало изменений, и я пытаюсь сравнить все изменения, внесенные в исходный каталог, в отношении новых файлов, добавленных по сравнению с старыми.

Есть ли какая-нибудь утилита для hg/ git, где я могу сделать дерево diff или что-то в этом роде? Так что, скажем, есть отметка между недавно добавленными файлами, удаленными файлами, я прошу слишком много?

Ответ 1

git diff делает именно это. но он работает только для проектов git.

hg diff, svn diff Довольно любая система управления версиями может различать деревья каталогов

Ответ 2

Чтобы просто создать diff patch в формате git diff из двух произвольных файлов или каталогов, без каких-либо причудливых материалов репозитория или управления версиями:

git diff --no-index some/path other/path >> some_filename

Jakub Narębski комментирует ответ knittl намекнул на ответ... Для простоты, что полная команда.

Часть >> создает файл и перенаправляет его на него. Если вам не нужен файл и вы хотите, чтобы выводимый на нем текст был напечатан, вы можете его скопировать, просто удалите часть >> some_filename.


Для удобного копирования и вставки, если вы уже cd ed в каталог, содержащий исходный каталог/файл с именем a и измененный каталог b, это будет:

git diff --no-index a b >> patch

Ответ 3

От git diff manpage:

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

[...]
  Если заданы ровно два пути, и по крайней мере один из них не проверен, сравните два файла/каталоги. Это поведение может быть вызвано --no-index.


Если вы хотите сравнить две версии (например, два помеченных релиза или две ветки) в двух разных репозиториях, вы можете использовать трюк, описанный в GitTips на странице Git Wiki, в разделе "Как сравнить два локальных репозитория".

Предполагая, что вы находитесь внутри одного репозитория, а второй репозиторий находится в /path/to/repo, поэтому его GIT_DIR /path/to/repo/.git, если это не-голый репозиторий, вы можете что-то вроде следующего:

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

где A и B - ревизии, которые вы хотите сравнить. Конечно, вы также можете указать ограничитель пути в приведенном выше выражении.

Объяснение: GIT_ALTERNATE_OBJECT_REPOSITORIES переменная может использоваться для создания команд Git для конкатенации базы данных объектов из двух репозиториев. git --git-dir=... rev-parse ... используется для преобразования имени (расширенного выражения SHA-1) в репозиторий, заданного параметром git-dir, в уникальный идентификатор SHA-1. Конструкция $( ... ) ставит результат вызова данной команды в командной строке. git diff используется для сравнения двух ревизий (где один из репозитория альтернативных объектов).

Альтернативным решением было бы просто импортировать другой репозиторий в данный репозиторий, используя git remote addgit fetch). Тогда у вас будет все локально, и вы сможете делать сравнения в одном репозитории.

Ответ 4

Это не git -специфичный, но как общая утилита diff для Windows, мне очень нравится WinMerge.

Ответ 5

Я действительно не понимаю, чего вы хотите, но не diff -ur достаточно для вас? Он будет работать даже в каталогах без какого-либо контроля версий.

Ответ 6

Есть ли какая-нибудь утилита для hg/git, где я могу сделать различие дерева... [s] о том, что есть отметка между вновь добавленными файлами, удаленными файлами... [выделение добавлено]

Да. Мы можем git diff текущего каталога против другого каталога и...

... пометить добавленные, удаленные и измененные файлы:

git diff --name-status --no-index ./ path/to/other/dir

... показать только добавленные файлы:

git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir

... показать только удаленные файлы:

git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir

... показывать только измененные файлы:

git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir

Смотрите также: https://git-scm.com/docs/git-diff