Виключіть каталог із git diff


179

Мені цікаво, як я можу виключити весь каталог із мого Git diff. (У цьому випадку / специфікація). Я створюю diff для всього нашого випуску програмного забезпечення за допомогою команди git diff. Однак зміни в специфікаціях не мають значення для цієї процедури, і просто створюють головні болі. тепер я знаю, що можу зробити

git diff previous_release..current_release app/

Це створило б різницю для всіх змін у каталозі додатків, але не, наприклад, у lib / каталозі. Хтось знає, як виконати це завдання? Дякую!

Редагувати: Я просто хочу, щоб було зрозуміло, я знаю, що я можу просто встановити параметри всіх моїх каталогів наприкінці, мінус / специфікація. Я сподівався, що існує спосіб по-справжньому виключити одну команду з команди.


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

Дивно, що у нас ще немає вбудованого Git-перемикача для цього на вересень 2016 року
Michael Z

Відповіді:


138

Якщо припустити, що ви використовуєте bash, і ви ввімкнули розширений глобул ( shopt -s extglob), ви можете це впоратися з боку оболонки:

git diff previous_release current_release !(spec)

Економить вам необхідність перераховувати всі інші речі.

Або оболонкові:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

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


1
PS підстановка не відповідає приховані файли, так що якщо ви нав'язливим, ви можете галс на , .!(.|)щоб матч все , починаючи з до .того ж .і ...
Каскабель

Схоже, це не працює для файлів, які є абсолютно новими або видаленими через гілки. Я отримую помилки, які зупиняють виконання сценарію, кажучи, що він не може відрізнятись від нього.
Грем Крістенсен

2
@Graham: Я вважаю, що --щойно доданий я повинен це виправити.
Каскабель

1
Дивовижна відповідь. Я хотів показати лише імена (а не фактичну різницю), тому мені довелося також додати --name-onlyв самому кінці.
серпень

1
Після того, як грати з ним, просто хочу додати , що якщо Ви зміните ім'я файлу, він буде видавати помилку , але все , що вам потрібно зробити , це додати , -- path/of/new/fileі він буде зрозуміти це :)
Серпня

321

На основі цієї відповіді ви також можете використовувати:

git diff previous_release..current_release -- . ':!spec'

Це нова функція git, яка дозволяє виключити певні шляхи. Він повинен бути більш надійним, ніж різні одноколірні шкаралупи.

Я розміщую це тут, тому що це питання все ще є хітом №1 для "git razl виключити шлях".


4
Люблю цю відповідь. Якщо додавати параметри, то зробіть це перед подвійним тире. Напр .: git diff previous_release current_release --name-status -- . ':!spec'
liamvictor

Не зрозумів, що я можу використовувати назви філій для цього, current_releaseі previous_release- змусив мене посміхнутися, коли я зрозумів це.
trueheart78

2
Що працювало на мене git diff --stat dev -- . ':!/Mopy/Docs/*'. Що не спрацювало для мене git diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'та варіації
Mr_and_Mrs_D

Дуже корисно. Ось синтаксис, щоб побачити, чи змінені будь-які файли, крім database.yml:git diff --check -- . ':!config/database.yml'
Dan Kohn

17
Також можна виключити декілька елементів, таких як:git diff previous_release current_release -- . ':!file_a' ':!file_b'
ПсевдоНойз

37

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

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'

33

Ви можете спробувати і скасувати атрибут diff для будь-яких файлів у каталозі lib.
.gitattributes:

lib/* -diff

racl101 додає в коментарях :

Додамо до цього, для тих із вас, хто хоче обмежити git diffвихід файлів певного типу, у певному каталозі та його підкаталогах, як, наприклад, у всіх JavaScript, створених пакетом .jsфайлів Webpack , наприклад, ви можете додати це до .gitattributes:

dist/js/**/*.js -diff

Тоді ви не бачите всього цього шуму у своєму виведенні git diff, і він просто показує: Binary files ... differщо корисніше.


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

2
@Mystr: Ви можете встановити цей .gitattributesфайл у спеціальній гілці, створеній лише для цього виду 'release' diff;) Перезавантажте цю спеціальну гілку на вершині current_releaseта зробіть відмінності звідти.
VonC

Це теж не працює для файлів, які видаляються через гілки. Вилучені файли все ще показують повну різницю.
Грем Крістенсен

Не працює для мене. Чи спеціальні _ доріжки? _site/* -diff
Маріус

@MariusAndreiana Ні, "_" не є особливим. Чи можете ви перевірити, яке правило gitattributes застосовується до файлу цієї папки за допомогою: git-scm.com/docs/git-check-attr
VonC,

22

Git diff тепер приймає спеціальний формат виключення: git diff -- ':(exclude)lib/*'

Будьте обережні, якщо у вас багато повторюваних імен папок ('/ app', '/ lib' тощо), оскільки це виключатиме файли відносно поточної робочої директорії І кореневої директорії git.


1
тобі не вистачає крапки, чи не повинно це бути git diff -- . ':(exclude)lib/*'?
Nicolas Dermine

1
@NicolasDermine Ні, хоча те, що ви написали, рівнозначне. Частина шляху "включає" також необов'язково. Ось чому ви можете просто робити git diffвсе, що стосується вашого поточного шляху, а не вимагатиgit diff -- .
MaxPRafferty

Примітка: на машинах Windows використовуйте подвійні лапки, як-отgit diff -- ":(exclude)lib/*"
cnlevy

Не знаю чому, але для мене це працює лише з крапкою, як запропонував @NicolasDermine. Я використовую Cmder на win10.
Оліввв

3

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

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

git diff -- ":(exclude)thingToExclude"

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

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

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

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

Деякі застосовані синтаксичні цукру

git diff -- ":!/\$1/"

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

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

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}

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