git difftool, відкрийте всі файли diff негайно, а не послідовно


240

Типовою поведінкою git diff є відкриття кожного файлу diff послідовно (чекайте, коли попередній файл буде закритий перед відкриттям наступного файлу).

Я шукаю спосіб відкрити всі файли одразу - наприклад, у BeyondCompare це відкриє всі файли на вкладках у межах одного вікна BC.

Це полегшило б перегляд складного набору змін; повернути назад і вперед між різними файлами і проігнорувати неважливі файли.


"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 mail .

Я зібрав сценарій оболонки на основі того потоку електронної пошти, який виконує каталог, що відрізняється від довільних комітів.

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

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

Ось опис проекту:

Скрипт git-diffall забезпечує механізм diff, заснований на каталозі. Сценарій спирається на параметр конфігурації 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 ? Я спробував і те, і інше, здається, вони забезпечують однаковий функціонал на перший погляд.
kynan

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

6
Оновлення (щодо git difftool --dir-diffта порівняння): я зв’язався із скутерним програмним забезпеченням (автори програми "Більше порівняння"), і вони кажуть, що bcompare.exeце не підтримується рішення і може спричинити проблеми, якщо одночасно відкрито більше одного диффузора. Вони планують додати підтримку для папок, що bcomp.exeвідрізняються у майбутній версії (тим часом я продовжуватиму використовувати bcompare.exeяк непідтримуваний спосіб вирішення).
Пітер Руст

4
@coin Я щойно тестував програму Beyond Compare 4, і --dir-diff, здається, працює з підтримуваним bcomp.exe.
Пітер Руст

5
Лише коментуючи, щоб сказати, що --dir-diffпрекрасно працює з Meld. Звідти це дозволить вам вибрати та переглянути різні файли для окремих файлів.
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 це відкриває один екран із кожним файлом у власній вкладці.


Дякуємо за публікацію На жаль, він не працює з варіантом WinMerge. Усі тимчасові файли, за винятком першого, видаляються до того, як WinMerge отримує їх для перегляду.
Карлос Рендон,

Карлос: Я використовую WinMerge з Git. Мій підхід полягав у тому, щоб додати "сон 1" після запуску WinMerge (який у моєму випадку, здається, вже запускається "у фоновому режимі" - немає необхідності в &). Таким чином тимчасовий файл живе досить довго, щоб WinMerge один раз його забрав (за винятком дивних випадків). Це також означає, що для їх відкриття потрібна 1 секунда на файл. Це неприємний злом (я б його ніколи не представляв як "відповідь"!), Але простий, досить ефективний.
Вуді Дзенфелл III

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

1
@DaveC в початковій темі пише, що "зберігати файл у папці cmd вашого git install" і продовжувати з прикладом у Windows. Де ви зберігали файл "git-diffall" в Linux?
m4l490n

2
Чи потрібно нам перезавантажувати вікна після додавання 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 та, можливо, інші), він автоматично перелічить всі змінені файли, і ви можете двічі клацнути, щоб переглянути окремі відмінності.

ІМО набагато простіше набрати meld .та дозволити йому розібратися у VCS, ніж налаштувати свій VCS для запуску meld. Крім того, ви можете використовувати одну і ту ж команду незалежно від того, який VCS використовується у вашому проекті, що чудово, якщо ви перемикаєтесь між ними багато.

Єдиним недоліком є ​​те, що meld повільніше сканує зміни, ніж передаються зміни з git / hg / svn, хоча, чи буде це повільно, щоб виникнути проблеми, буде залежати від того, як ви її використовуєте, я впевнений.


4
Для мене головним недоліком є ​​те, що meld (з будь-якої причини) відкриває diff у новому вікні замість нової вкладки, а після закриття diff файл у робочому каталозі відкриється у новій вкладці із дратівливим спливаючим повідомленням раніше.
kynan

приємний інструмент, але жахлива установка Windows (станом на початок 2012 року).
Wernight

@kynan Це здається ідеальним рішенням для агностичного способу VCS, що відрізняється, якщо не для цієї дратівливої ​​речі з подвійним вікном. Прикро. :(
PKKid

Відмінна особливість meld - це його різні фільтри: ігнорувати зміни, наприклад у коментарях або додавати / видаляти порожні рядки, що git diffне пропонує.
кинан

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

3

Я знайшов цей метод (GitDiff.bat і GitDiff.rb), який копіює файли у старі / нові темп-дири, а потім порівнює папки на них.

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

Редагувати: подібний метод тут у відповідь на моє запитання у списку розсилки git.



2

Тут помітили, що в Araxis Merge є команда "-nowait":

-nowait Запобігає порівнянню від очікування закриття порівняння

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


2

Дифуз також має VCS інтеграцію. Він взаємодіє з безліччю інших VCS, включаючи SVN, Mercurial, Bazaar, ... Для Git він навіть покаже три панелі, якщо деякі, але не всі зміни будуть інсценовані. У випадку конфліктів навіть буде чотири екрани.

Скріншот дифузного з поетапним та нестандартним редагуванням

Викликайте це с

diffuse -m

у вашій робочій копії Git.

Якщо ви запитаєте мене, найкраща візуальна різниця, яку я бачив протягом десяти років. (І я теж спробував meld.)


Чи можете ви сказати, яка частина дифузної вам сподобалася, особливо над золотою?
musiphil

@musiphil: Мені подобається її простота - здається, вона має точний набір функцій, необхідних для вирішення завдання, не більше, але й не менше. .
krlmlr

1
Дифуз працював з git без будь-якої конфігурації. Diffuse -m відкриває одне вікно з git відрізняється на різних вкладках; тоді як інші інші інструменти потребують занадто великої конфігурації, щоб навіть почати роботу.
мош

1

Якщо все, що ви хочете зробити, це відкрити всі файли, які зараз модифікуються, спробуйте щось на кшталт:

vi $ (статус git | sed -n '/.* змінено: * / s /// p')

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

git add - патч
що дозволить вам вибірково влаштовувати хунки.


1

Я написав сценарій powerhell, який буде дублювати два робочих дерева і порівнювати з 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
Так, я вважаю, що gitk є корисним, але коли мова заходить про різний BC, це те, що я хочу бачити :)
Seba Illingworth,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.