Як зробити так, щоб робота працювала як git-diff?


148

Мені подобається форматування вихідних даних git diff. Колір та +/ -представлення змін між рядками читається легше, ніж GNU diff.

Я можу працювати , git diffвикористовуючи --no-indexпрапор за межами мерзотника репо і вона відмінно працює. Однак, як видається, відсутня --excludeможливість виключення файлів або підкаталогів з рекурсивної diff.

Чи є спосіб отримати найкраще з обох світів? (параметри кольорів та +/ -формат git diffта --excludeопція GNU різн.)

Я експериментував colordiff, але все ще віддаю перевагу вихідному форматуgit diff


1
Для того, щоб зробити синій колір для додавання зеленого зміни newtextв /etc/colordiff. Я думаю, що git використовує зелений?
Руді

1
Я досі не чув про прапор --no-index. Я тільки що використовував його для порівняння результатів з git show з різницею двох файлів - дякую за це!
AJM-Reinstate-Monica

Відповіді:


175

Я не знаю, як зробити колір, але це +/-скоріше, ніж <і >.

diff -u file1 file2

6
Класно, це в поєднанні з colordiff наближає мене до того, що я хочу. Здогадайтесь, наступного разу мені потрібно прокручувати сторінку чоловіка далі ... Дякую!
Mzzzzzz

13
Простий спосіб отримати розфарбовування з дифф -u, також конвеєрний висновок в ТИГ, командний рядок мерзотник репо Глядач: diff -u file1 file2 | tig.
Самуель Лампа

3
Встановіть colordiffз вашого сховища apt / yum / pacman і використовуйте його.
iBug

Потрібно для включення додаткових пакетів для Enterprise Linux (EPEL) на Amazon Linux для встановлення colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Пат Майрон

1
Крім того colordiff, ви також можете отримати колір за vimдопомогою визначення cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major

94

Ви також можете використовувати git diff --no-index -- A B(через manpage ).


1
+1, але, на жаль, це не працює, якщо один із файлів є посиланням.
Еміль Лундберг

2
+1 Це дуже корисно, оскільки показує, як зробити звіт про git, де два відстежуваних файли Aта Bвідрізняються порівняно один з одним замість того, де кожен файл був змінений відносно останньої відповідної редакції.
Дж. Кацвінкель

@EmilLundberg: працює для мене із посиланнями в git 1.9.1 на Linux. Я не знаю, чи зламані більш ранні версії.
ккм

3
git diff --no-indexце чудово, але, як зазначав ОП, йому не вистачає --excludeпрапора, тому він часто має дуже обмежену корисність.
Кен Вільямс

25
  1. Встановіть colordiff .

  2. Оновіть ~ / .colordiffrc (спочатку скопіюйте / тощо / colordiffrc):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Використовуйте colordiff -u file1 file2для двох файлів або colordiff -ruN path1 path2для рекурсивного порівняння контурів.

Це не зовсім те саме, але це дуже близько.


18

Це те, що я пропоную, і це досить близько

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Вам доведеться встановити це
  • -R: це повідомляє Менше показувати кольори замість необроблених кодів.

Я в кінцевому рахунку використовував, -wтому що не хотів бачити, як пробіли відрізняються.

diff -w -u FILE1 FILE2 | colordiff | less -R

Редагувати: Як запропонував @Ciprian Tomoiaga у коментарі, ви можете зробити цю функцію і помістити її також у свій ~/.bashrcфайл.

function gdiff () { diff -u $@ | colordiff | less -R; }

4
Щоб мати єдину функцію bash для цього, додайте до .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă

4

Відповідно до цієї відповіді на Unix SE, GNU diffмає --colorваріант з версії 3.4 наприкінці 2016 року . Це поряд має бути достатньо, щоб імітувати вихід :-ugit diff

diff -u --color=always file1 file2 | less -r

--colorповинна бути alwaysвикористана в трубі, autoбуде вимикати колір у трубах.

Я лише спробував це з Git Bash в Windows, де less -Rбуло б забарвити лише перший рядок. less -rвиправив це для мене в такому випадку.


3

Використовуючи тільки bash, diff, tput, і less, ми можемо тісно наблизити вихід git diff. Однак будуть деякі помітні відмінності через короткозорість diffпрограмістів.

Помістіть таке визначення функції Bash у якийсь файл, який автоматично отримує ваш обліковий запис користувача, і ви зможете отримати доступ до функції з командного рядка:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Ця функція працює наступним чином:

  1. Зрештою, на нього diffпосилаються різні параметри форматування, щоб вказати, як відображатимуться зміни у файлах.
  2. tputвикористовується для вставлення кольорів ANSI в ці параметри форматування. Зверніть увагу , що при використанні не-ANSI терміналів, можливо , доведеться замінити tput setafз tput setf.
  3. Вихід diffвідводиться в трубу less. -Rдозволяє зберегти кольори ANSI. -Xне дозволяє lessочищати екран після виходу. -Fзаважає lessпрацювати як пейджер, якщо вихід відповідає одному екрану.
  4. Якщо перший параметр є @full, функція відображатиме всі незмінні рядки на додаток до доданих та видалених рядків.

Зверніть увагу на наступні відмінності між цим підходом та git diff:

  1. git diffповідомляє про три рядки контексту, що оточують кожну зміну. На жаль, diffсхоже, скаржиться та виходить, якщо ви хочете вказати кількість рядків контексту, одночасно вказавши параметри форматування. (Принаймні, це робиться в Mac OS X Yosemite). Дякую diffпрограмістам. Отже, ви можете або вимагати жодних рядків контексту, що оточують кожну зміну, що є поведінкою за замовчуванням, або ви можете вимагати, щоб про всі незмінені рядки у файлі також повідомлялося, вказавши @fullяк перший параметр.
  2. Оскільки рядки контексту відрізняються від git diffномерів рядків, повідомлених цією функцією, також будуть відрізнятися від тих, про які повідомляється git diff.
  3. Ви можете побачити наявність повідомлень про однорядкові зміни, що є правильною поведінкою, але дратує, коли ваш змінений файл містить вставлення одиночних порожніх рядків. Я думаю, що git diffвирішувати це краще, через його контекст. Ви можете спробувати прийняти різні варіанти, щоб diffкраще розібратися з пробілом, якщо хочете.


2

Розмістіть це у своєму .bashrcабо .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

Вимоги: gitі їх colordiffслід встановлювати заздалегідь.

використання: diff file1 file2

приклад: за $diff .tmux.conf .zshrc.pre-oh-my-zsh

Приклад функцій різ


0

Інший варіант - зробити це поза сховищем, щоб git знав відрізнятись між файлами. напр. функція оболонки на зразок:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

Використовуйте colordiff :

Установка:

sudo apt-get install colordiff

Використання:

colordiff -u file_one file_two

Дає абсолютно таку ж різницю, як показано на git diff.


0

Якщо у вас немає colordiffабо git diff, ви можете отримати колір за допомогою vim.

cdiff() { diff -u $@ | vim -R -; }

або просто

cdiff() { diff -u $@ | view -; }

0

Оскільки кажан має гарне забарвлення, я перевірив, чи працює це diffзанадто і дивно, що він справді добре працював поза коробкою.

$ diff file1 file2 | bat або $ diff -u file1 file2 | bat

Тому я припускаю, що ви можете зробити функцію на зразок цієї нижче, щоб бути більш ефективною:

function bdiff () { diff -u $@ | bat;}


-2

Я думаю, що налаштування конфігурації:

[color]
     ui = true

у поєднанні з командою "diff" --relative=<path>може зробити те, що ви хотіли. Ви пробували?


3
Це для відмінностей git. Він просив diffваріанти програми
tr33hous
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.