Хочете виключити файл із "git diff"


229

Я намагаюся виключити файл ( db/irrelevant.php) з Git diff. Я спробував помістити файл у dbпідкаталог, який називається .gitattributesрядком, irrelevant.php -diff і я також спробував створити файл, який називається, .git/info/attributesщо містить db/irrelevant.php.

У всіх випадках db/irrelevant.phpфайл міститься у diff як бінарний патч Git. Я хочу, щоб зміни в цьому файлі були ігноровані командою diff. Що я роблю неправильно?

Відповіді:


325

Omg, драйвери та awk, щоб виключити паршивий файл? З git 1.9 ви можете:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

Ах, елегантність! Дивіться цитовану відповідь та детальніше цю відповідь від @torek


4
ПРИМІТКА. Якщо ви хочете виключити конкретне ім'я файлу, вам слід встановити префікс зірочкою, відмінною від .gitignoreсинтаксису файлу. Наприклад, :!*shrinkwrap.yamlзамість :!shrinkwrap.yaml.
воган

7
Виключіть більше файлів, наприклад, у мене є * .min.css і * .min.js файли, щоб уникнути git diff. Отже, я використовую командуgit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare

4
синтаксис windows : git diff -- . ":(exclude)db/irrelevant.php"(подвійні лапки замість одинарних лапок)
cnlevy

4
Дякую! Такий езотеричний синтаксис .. Я мушу щоразу його шукати.
Даніель Уолтріп

1
@cnlevy або жодних цитат! git diff -- . :(exclude)db/irrelevant.php
Маттіас

62

Ви можете налаштувати спеціальний драйвер diff із командою no op та призначити його тим файлам, які слід ігнорувати.

Створіть для цієї команди специфічний драйвер різниці для сховища

git config diff.nodiff.command /bin/true

або для всіх ваших репостів --global.

(Якщо /bin/trueв MacOS не існує, використовуються альтернативи /usr/bin/trueабо echo).

Потім призначте новий драйвер різниці для тих файлів, які ви хочете проігнорувати у своєму .git/info/attributesфайлі.

irrelevant.php    diff=nodiff

Якщо цей стан має бути спільно з іншими розробниками , ви могли б використовувати .gitattributesзамість .git/info/attributesі розділити git configкоманду зі своїми колегами (через файл документації або що - то).


2
Це саме те, що я шукав - як описано в kerneltrap.org/mailarchive/git/2008/10/17/3711254 я відредагував ~ / .gitconfig, додавши: [diff "nodiff"] `command = / bin / true`, а потім створив файл з назвою .git / info / атрибути, до яких я додав: irrelevant.php diff=nodiff
Майкл

12
Ця відповідь для мене працювала набагато краще: stackoverflow.com/questions/1016798/…
Neil Forrester

3
Цікаво, що такий підхід не працює git diff --stat. У цьому випадку можна було б скористатися git diff ... | diffstatяк вирішення.
ddkilzer

@Michael це посилання, як видається, пошкоджене, є інше?
DickieBoy

3
лише доповнення: якщо ви хочете змусити git diff відобразити його все одно, використовуйте--no-ext-diff
Флоріан Кляйн

35

Ви також можете скористатися програмою filterdiff колекції програми patchutils, щоб виключити деякі частини розд . Наприклад:

git diff | filterdiff -p 1 -x db/irrelevant.php

4
Зауважте, що -pз manpage (1) є "-pn, --strip-match = n При збігу ігноруйте перші n компонентів імені шляху." Мені знадобився певний час, щоб зловити, що -p 1вилучає dbчастину зі шляху ОП. Якщо ви просто хочете вказати ім'я файлу і проігнорувати всі можливості шляху / dir, ви можете використовувати -p 99.
Тайлер Колліер

32

Цей метод коротший, ніж прийняті відповіді.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

Для отримання додаткової інформації про різні можливості включення / виключення читайте цей інший пост


Майте на увазі, що фільтр застосовується лише до всіх файлів нижче поточного каталогу.
Chiel ten Brinke

Це була найкраща відповідь. Я був в стані спростити це трохи більше: stackoverflow.com/a/58845608/3886183
dlsso

2
Я б видалив частину --stat або хоча б пояснив, що вона робить, оскільки жодна з інших відповідей не містить її.
mix3d

Державний прапор показує вам файли та їх різну суму, що дозволяє легко перевірити, чи працював фільтр так, як ви задумали.
Chiel ten Brinke

17

Це однорядкове рішення не потребує інших утиліт / завантажень:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

Звідки file/to/exclude.txtназва файлу, який ви хочете виключити.

Редагувати: кредит ksenzee для виправлення видалених файлів, що порушують розл .


Я намагаюся git diff --stat masterбез особливих успіхів адаптувати ваш один лайнер - ви могли б допомогти?
Mr_and_Mrs_D

13

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

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

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

file-not-to-diff.bin -diff

Це все ще дозволяє git status"побачити", якщо файл змінився. git diffтакож "побачить", що файл змінився, але він не генерує diff.

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


11

Найпростіша відповідь

git diff ':!db/irrelevant.php'

Це тільки ':!<path to file>'після вашої команди diff. Команда diff може бути такою ж складною, як вам подобається, і ви можете використовувати подвійні символи типу *.min.jsабо додати кілька виключень (пробіл відокремте цитовані блоки), якщо хочете.


5

Відносно кореневого каталогу git

git diff приймає необов’язкове виключення

git diff -- ":(exclude)thingToExclude"

Можливо, ви захочете додати деякі підказки

git diff -- ":(exclude)*/thingToExclude/*"

Націлити конкретні типи файлів

git diff -- ":(exclude)*/$1/*.png"

Або опустіть невеликий сценарій для своїх dotfiles

Такі як .bash_profileабо.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}

це просто не працює для мене, я не отримую відмінностей взагалі з обома синтаксисами, використовуючи (виключаю) або !. У мене git 2.21.0
Olivvv

Ви можете створювати різні або нестандартні, або поетапні файли. Якщо ви додали git, вони стають поетапними. Якщо вони будуть поставлені, ви можете зробити git diff --stagedНадіюсь, це вам допоможе.
Jasonleonhard

Синтаксично, що робить двокрапка?
Йона

2

Це дуже просто, ви можете виключити те, що ви хочете, використовуючи стандартні команди Unix, ці команди доступні під git bash навіть у середовищі Windows. Нижче на прикладі показано, як виключити файли diff для pom.xml-файлів, спочатку перевірте diff для master лише для імен файлів, потім використовуючи 'grep -v', виключіть файли, які ви не хочете, а потім запустіть знову diff для master зі списком preppred:

git diff master `git diff --name-only master | grep -v pom.xml`

1

схоже на рішення Бена Ру , але все одно поділяється:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

або, якщо зміни вже здійснені локально:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

Приклади:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master

1

Я роблю наступне:

git add *pattern_to_exclude*
git diff
git reset HEAD .

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


0

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

По-перше, налаштуйте різний інструмент, якщо ви ще цього не зробили.

$ git config --global diff.tool = meld

Потім ви можете запустити каталог diff.

$ git difftool --dir-diff

Ви зможете переглядати різниці (по файлу) у Meld (або вашому інструменті на вибір). Просто не відкривайте файл, який ви хочете проігнорувати.

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