git difftool, откройте все файлы diff немедленно, а не последовательно

поведение git diff по умолчанию-открыть каждый файл diff в serial (дождитесь закрытия предыдущего файла перед открытием следующего файла).

Я ищу способ открыть все файлы сразу-в BeyondCompare, например, это откроет все файлы на вкладках в одном окне BC.

это облегчило бы обзор сложного набора изменений; перелистывать назад и вперед между файлами diff и игнорировать неважные файлы.

12 ответов


начиная с git v1.7.11, вы можете использовать git difftool --dir-diff для выполнения каталога diff.

следующий ответ относится к git установки старше v1.7.11.


этот же вопрос был задан на список почты git.

я собрал скрипт на основе этого потока электронной почты, который выполняет сравнение директорий между произвольными изменениями.

начиная с git v1.7.10, git-diffall скрипт включен в contrib стандартной установки git.

для версий до v1.7.10, вы можете установить от git-diffall на GitHub.

описание проекта:

скрипт git-diffall предоставляет основанный на каталоге механизм diff для мерзавец. Сценарий опирается на разница.параметр конфигурации инструмента для определите, какой diff viewer используется.

этот скрипт совместим со всеми формы, используемые для указания диапазона изменения в diff:

1) git diffall: показывает разницу между рабочее дерево и поэтапные изменения
2) git diffall --cached [<commit>]: показывает разница между поэтапными изменениями и HEAD (или другой именованный commit)
3) git diffall <commit>: показывает разницу между рабочее дерево и имя commit
4) git diffall <commit> <commit>: показать дифф между двумя именованными коммитами
5) git diffall <commit>..<commit>: аналогично выше
Шесть) git diffall <commit>...<commit>: показать изменения на ветке, содержащей и до во-вторых, начиная с общего предок обоих!--13-->

Примечание: все формы принимают необязательный путь ограничитель [--] [<path>]

этот скрипт основан на пример предоставлено Thomas Rast на Git список.


вот на чем я остановился...

скопируйте следующий код в файл с именем git-diffall (без расширения):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

поместите файл в cmd папка вашего git install dir (например,C:\Program Files (x86)\Git\cmd)

и использовать, как вы бы git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Примечания: ключ к нему является & param, который сообщает внешней команде diff для запуска в фоновой задаче, поэтому файлы обрабатываются немедленно. В случае BeyondCompare это открывается один экран с каждым файлом в отдельной вкладке.


meld имеет аккуратную функцию, что если вы дадите ему каталог под контролем источника (Git, Mercurial, Subversion, Bazaar и, возможно, другие), он автоматически перечислит все измененные файлы, и вы можете дважды щелкнуть, чтобы просмотреть индивидуальные различия.

IMO это намного проще ввести meld . и иметь его выяснить VCS, чем настроить VCS для запуска meld. Кроме того, вы можете использовать одну и ту же команду независимо от того, какой VCS ваш проект использует, который это здорово, если вы переключаетесь между ними много.

единственным недостатком является то, что для meld медленнее сканировать изменения, чем передавать изменения из git/hg/svn, хотя достаточно ли это медленно, чтобы быть проблемой, будет зависеть от того, как вы его используете, я уверен.


Я нашел этот метод (GitDiff.летучая мышь и GitDiff.rb), который копирует файлы в Старые/новые временные dirs, а затем сравнивает их с папкой.

но я бы предпочел просматривать рабочие файлы напрямую (из рабочего каталога), так как BeyondCompare имеет удобную функцию редактирования файла из окна diff, что отлично подходит для быстрой очистки.

Edit: a подобный метод здесь в ответ на мой вопрос о рассылке git список.


git meld => https://github.com/wmanley/git-meld это удивительный скрипт, который откроет аккуратное различие всех файлов в одном окне.


диффузное также имеет интеграцию VCS. Он взаимодействует с множеством других VCS, включая SVN, Mercurial, Bazaar,... Для Git он даже покажет три панели, если некоторые, но не все изменения поставлены. В случае конфликтов будет даже четыре окна.

Screenshot of diffuse with staged and unstaged edits

вызвать

diffuse -m

в вашей рабочей копии Git.

Если вы спросите меня, лучшее визуальное различие, которое я видел за десятилетие. (И я тоже пробовал meld.)


заметил тут это слияние Araxis имеет опцию команды "- nowait":

- nowait предотвращает сравнение от ожидания сравнения, чтобы быть закрытым

может быть, это возвращает код немедленного выхода и будет работать, кто-нибудь испытал это? Не могу найти аналогичный вариант для BeyondCompare...


Если все, что вы хотите сделать, это открыть все файлы, которые в настоящее время изменены, попробуйте что-то вроде:

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

Если вы делаете коммиты "сложных наборов изменений", вы можете пересмотреть свой рабочий процесс. Одна из действительно приятных особенностей git заключается в том, что разработчику легко уменьшить сложные наборы изменений до серии простых патчей. Вместо того, чтобы пытаться редактировать все файлы, которые в настоящее время изменены, вы можете посмотреть в

git add --patch
что позволит вам избирательно расставлять куски.

Я написал сценарий powershell, который будет дублировать два рабочих дерева и сравнивать с DiffMerge. Так что вы можете сделать:

GitNdiff master~3 .

для сравнения главной ветви три проверки назад с текущим рабочим деревом, например.

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

http://github.com/fschwiet/GitNdiff


для тех, кто заинтересован в использовании git-diffall на Mac OS X с Araxis, я разветвил проект git-diffall на github и добавил AppleScript, который обертывает команду слияния Araxis. Примечание: это слегка измененный клон araxisgitdiff файл, который поставляется с Araxis Merge для Mac OS X.

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


следующие работы с meld и kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

открывает все файлы в окне, которое вы можете просматривать с легкостью. Может использоваться с наборами изменений в месте происхождения/ветка

например: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


можно использовать gitk и видим все различия, в то же время