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


240

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

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

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


"git diff" или "git difftool"? Возможно, вы захотите опубликовать запрос (открытый для всех и с различным веб-интерфейсом) в списке рассылки git: git@vger.kernel.org
Jakub Narębski

Я использую "git difftool" для запуска внешнего приложения diff. Спасибо за идею списка рассылки.
Себа Иллингворт,

Было бы полезно узнать платформу. На платформе Unix я написал бы скрипт для выполнения diff и поручил git использовать этот скрипт. В сценарии я бы просто запустил diff в фоновом режиме, а затем позволил сценарию умереть.
Крис Кливленд

Платформа Windows, но спасибо за идеи, Крис.
Себа Иллингворт

Ответы:


214

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

Например, эта функция хорошо работает с Meld 3.14.2 и позволяет просматривать все измененные файлы:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Это удобная функция Bash:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

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


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

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

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

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

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

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

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

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

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

Этот скрипт основан на примере, представленном Томасом Растом в списке Git .


В чем разница между git-diffall и github.com/wmanley/git-meld ? Я попробовал оба, и они, кажется, обеспечивают идентичную функциональность на первый взгляд.
Кинан

5
Я, например, очень ценю ваш сценарий. Честно говоря, я не могу понять, почему Git ведет себя неправильно в этом отношении (Mercurial делает и делал это в течение многих лет), а также я не могу понять отсутствие интереса со стороны сообщества Git.
Дуглас

6
Обновление (касательно git difftool --dir-diffBeyond Compare): я связался с Scooter Software (авторами Beyond Compare), и они сказали, что bcompare.exeэто не поддерживаемое решение и может вызвать проблемы, если одновременно открыто более одного открытия. Они планируют добавить поддержку различий папок bcomp.exeв будущей версии (тем временем я продолжу использовать bcompare.exeв качестве неподдерживаемого обходного пути).
Питер Руст

4
@coin, который я только что протестировал с Beyond Compare 4, и --dir-diff работает с поддерживаемым bcomp.exe.
Питер Руст

5
Просто комментируя, чтобы сказать, что --dir-diffпрекрасно работает с Мелдом. Оттуда он позволит вам выбирать и просматривать различия для отдельных файлов.
mkasberg

61

Вот что я остановился на ...

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

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

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

И используйте как вы git diff:

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

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


Спасибо за публикацию. К сожалению, он не работает с опцией -s WinMerge. Все временные файлы, кроме первого, удаляются, прежде чем WinMerge сможет их просмотреть.
Карлос Рендон

Карлос: я использую WinMerge с Git. Мой подход заключался в добавлении «сна 1» после запуска WinMerge (который в моем случае, кажется, уже запускается «в фоновом режиме» - нет необходимости для &). Таким образом, временный файл живет достаточно долго, чтобы WinMerge мог его забрать один раз (кроме странных случаев). Это также означает, что для открытия всех файлов требуется 1 секунда на файл. Это неприятный хак (я бы никогда не представил его как «ответ»!), Но простой, довольно эффективный.
Вуди Зенфелл III

2
Для использования в Linux с Git 2.x мне пришлось внести небольшую модификацию: изменить "$filename"на "../$filename". Тогда это отлично работало с Beyond Compare
Дейв С

1
@DaveC в оригинальном потоке говорит «сохранить файл в папке cmd вашей git install» и продолжает пример с windows. Где вы хранили файл "git-diffall" в Linux?
m4l490n

2
Нужно ли перезагружать Windows после добавления git-diffallфайла в C:\Program Files\Git\cmdпапку? Я сделал именно так, как было $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
сказано,

19

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

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

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


4
Для меня главным недостатком является то, что meld (по какой-либо причине) открывает diff в новом окне вместо новой вкладки, и после закрытия diff файл в рабочем каталоге открывается в новой вкладке с раздражающим всплывающим сообщением ранее.
Кинан

хороший инструмент, но ужасная установка Windows (по состоянию на начало 2012 года).
Wernight

@kynan Похоже, это идеальное решение для агностического способа дифференцирования в VCS, если бы не эта раздражающая всплывающая вещь с двойным окном. Это позор. :(
PKKid

Отличной особенностью meld являются его фильтры diff: игнорируйте изменения, например, в комментариях или добавляйте / удаляйте пустые строки, которые git diffне предлагаются.
Кинан

1
Я использовал этот подход в течение года или около того; он отлично работает для небольших проектов, но если у вас большой проект (например, много файлов), он слишком медленный, так как он вручную «сканирует» на наличие git diff (не уверен, почему он использует этот подход, когда git явно может предоставить ему список файлы напрямую ...)
namuol

3

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

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

Изменить: аналогичный метод здесь в ответ на мой вопрос в списке рассылки git.



2

Здесь замечено, что у Araxis Merge есть опция команды -nowait:

-nowait Предотвращает сравнение от ожидания закрытия сравнения

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


2

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

Снимок экрана: диффузное поэтапное и неустановленное редактирование

Вызвать его с

diffuse -m

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

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


Можете ли вы сказать, какая часть diffuse вам понравилась, особенно по сравнению с meld?
Musiphil

@musiphil: мне нравится его простота - кажется, он обладает точным набором функций, необходимых для решения задачи, не больше, но и не меньше. (Подобно выравниванию различий и ширине табуляции.) Я не помню, почему я переключился с комбинации, и с тех пор я не использовал комбинацию, поэтому я не могу сравнить их сейчас.
krlmlr

1
Diffuse работал с git без какой-либо настройки. Diffuse -m открывает одно окно с git diff в разных вкладках; в то время как другим инструментам требуется слишком много настроек, чтобы начать работу.
мош

1

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

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

Если вы делаете коммиты «сложных наборов изменений», вы можете пересмотреть свой рабочий процесс. Одна из действительно приятных особенностей git - это то, что разработчик может легко сводить сложные наборы изменений к серии простых патчей. Вместо того, чтобы пытаться редактировать все файлы, которые в данный момент изменены, вы можете посмотреть

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


1

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

GitNdiff master~3 .

Например, чтобы сравнить основную ветку три проверки назад с текущим рабочим деревом.

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

http://github.com/fschwiet/GitNdiff


1

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

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


1

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

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

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

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


-2

Вы можете использовать Gitk и увидеть все различия одновременно


3
Да, я нахожу Гитк полезным, но когда дело доходит до разногласий до н.э., я хочу увидеть это :)
Себа Иллингворт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.