Ответ 1
git diff
делает именно это. но он работает только для проектов git.
hg diff
, svn diff
Довольно любая система управления версиями может различать деревья каталогов
Я унаследовал проект, первоначально сохраненный в CVS со всеми версиями. Я сделал немало изменений, и я пытаюсь сравнить все изменения, внесенные в исходный каталог, в отношении новых файлов, добавленных по сравнению с старыми.
Есть ли какая-нибудь утилита для hg/ git, где я могу сделать дерево diff или что-то в этом роде? Так что, скажем, есть отметка между недавно добавленными файлами, удаленными файлами, я прошу слишком много?
git diff
делает именно это. но он работает только для проектов git.
hg diff
, svn diff
Довольно любая система управления версиями может различать деревья каталогов
Чтобы просто создать 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
От 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 add
(и git fetch
). Тогда у вас будет все локально, и вы сможете делать сравнения в одном репозитории.
Это не git -специфичный, но как общая утилита diff для Windows, мне очень нравится WinMerge.
Я действительно не понимаю, чего вы хотите, но не diff -ur
достаточно для вас? Он будет работать даже в каталогах без какого-либо контроля версий.
Есть ли какая-нибудь утилита для 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