Git: чи можу я придушити список "модифікованого вмісту" / брудних записів субмодулів у статусі, розбіжності тощо?


123

Деякі коли (приблизно 1.6.x випуски, я думаю) git дізнався про зміни всередині підмодулів. Це лише дратує мене:

$ git статус постачальника | grep змінено:
# модифіковано: постачальник / рейки (модифікований вміст)
$ git diff постачальник /
різн. - поставте a / постачальника / рейки b / постачальника / рейки
--- a / постачальник / рейки
+++ b / постачальник / рейки
@@ -1 +1 @@
-Завдання підпроекту 046c900df27994d454b7f906caa0e4226bb42b6f
+ Комісія підпроекту 046c900df27994d454b7f906caa0e4226bb42b6f-брудна

Будь ласка, зупиніть це?

Редагувати:

Гаразд, значить, у мене є відповідь. Тепер у мене ще одне питання:

Чи можу я це вкласти ~/.gitconfig? З мого початкового моменту виходить, що я не можу, і я не бачив нічого перспективного, прокинувши патч. (Я думаю, я все ще можу зробити псевдонім.)


Я бачу деякі виправлення у списку розсилки git щодо цього, датування червня 2010 року. Тож, сподіваємось, це буде у майбутньому випуску. (google для 'git' --ignore-submodules = брудний '')
kch

+1 для пояснення, чому повідомлення виникає!
dotancohen

Відповіді:


175

Існує навіть можливість встановити режим ігнорування для кожного доданого підмодуля у файлі .gitmodules.

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

Суть цього:

Щойно ви додали підмодуль, .gitmodulesу корені вашого сховища з'явиться файл, названий у корені

Просто додайте до цього .gitmodulesфайлу один рядок :

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

5
+1, але я включив основну частину вашої публікації в блог до вашої відповіді на SO: ваше зовнішнє посилання може стати недійсним одного дня, на відміну від відповідей на SO, які існуватимуть назавжди (за допомогою сміттєвих відвалів: blog.stackoverflow.com/2009/ 06 /… )
VonC

5
Я виявив, що мені потрібно ввести файл .gitmodules, перш ніж git statusпрацювати, як очікувалося. Також вам потрібно принаймні 1.7.4 або краще, я вважаю.
aleemb

Для .gitignoreфайлу існує приватна версія, що називається exclude, розташована в .git/info/, яка не обробляється версією. Чи є відповідний файл для цього .gitmodulesфайлу, який дозволить придушити зміни в підмодулі лише у вашому екземплярі батьківського сховища, не вносячи змін до .gitmodules?
HelloGoodbye

2
Я не можу змусити це працювати з підмодулем, який відстежує гілку. Це не підтримується для цього? `` `[підмодуль" smstack / ansible / hosts "] path = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty` `` ``
Marc Abramowitz

1
@MarcAbramowitz Я натрапив на одне й те саме питання, я думаю - ви знайшли рішення для цього?
Себастьян Г. Марінеску

61

Існує два види повідомлень про зміни, які можна придушити.

Перше - це те, untracked contentщо відбувається, коли ви вносите зміни до свого підмодулю, але ще не зробили їх. Батьківський репозиторій помічає це та git statusповідомляє про це відповідно:

modified: modules/media (untracked content)

Ви можете придушити їх за допомогою:

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

Однак після внесення цих змін батьківський сховище знову повідомляє про них та повідомляє про них:

modified:   modules/media (new commits)

Якщо ви також хочете їх придушити, вам потрібно ігнорувати allзміни

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all

2
Для .gitignoreфайлу існує приватна версія, що називається exclude, розташована в .git/info/, яка не обробляється версією. Чи є відповідний файл для цього .gitmodulesфайлу, який дозволить придушити зміни в підмодулі лише у вашому екземплярі батьківського сховища, не вносячи змін до .gitmodules?
HelloGoodbye

1
HelloGoodbye: Якщо ви перевірите .git / module / $ MODULENAME /, ви побачите, що, схоже, є .git каталогом для цього модуля. Зміна файлу інформації / виключення в цьому місці виконує цю роботу.
PaulW

1
ignore = allЧастина корисна.
Ерік Ван

53

Оновлення: Див (і upvote) nilshaldenwang «s відповідь про можливість додати в .gitmodulesфайл конфігурації параметр для ігнорування брудного стану даного субмодуля.

ignore = dirty

Таким чином, git 1.7.2 вийшов і включає --ignore-submodulesопцію для status.

Від git help status:

--ignore-підмодулі [= <when>]
    Ігноруйте зміни в підмодулях під час пошуку змін.
    <when> може бути або "без треку", "брудним", або "всім", який
    є типовим. При використанні "без треку" підмодулі є
    не вважаються брудними, коли вони містять лише непошкоджені
    вмісту (але вони все ще скануються на змінений вміст).
    Використання "брудного" ігнорує всі зміни в робочому дереві
    підмодулі, лише зміни до комітетів, що зберігаються в
    показані суперпроекти (така поведінка була раніше
    1.7.0). Використання "всіх" приховує всі зміни субмодулів (і
    пригнічує вихід підсумків підмодулів, коли
    параметр config status.submodulesummary встановлено).

Цінність, яку я хочу, - це dirty.

git status --ignore-submodules=dirty

Я використовую псевдонім, тому що я лінивий:

alias gst='git status --ignore-submodules=dirty'

2
Оскільки це прийнята відповідь, я думаю, ви також повинні додати можливість додавання ignore=dirtyдо окремих записів у .gitmodulesфайлі тут.
Андрій Дроздюк

14

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

Також оголошено у випуску Git 1.7.2-rc2 :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

" git status" вивчений --ignore-submodulesваріант " ".

Значення:

git config --global diff.ignoreSubmodules dirty

Розглядати це як варіант не на даний момент обрано саме такий підхід :

Після цієї серії я планую додати параметр конфігурації ' ignore' до .gitmodules, який можна встановити для кожного підмодуля або "всі", "брудні", "без треку" або "ні" (за замовчуванням).

" git diff" і " git status" будуть використовувати це значення конфігурації для кожного підмодуля.
Використання " --ignore-submodule" переосмислює це значення за замовчуванням (і новий параметр "немає" буде доданий туди, щоб мати змогу змінити параметри конфігурації).

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

Таким чином, користувачі можуть перекрити налаштування, але якщо цього не зробити, вищевиті потоки можуть легко змінити його (наприклад, коли підмодулі .gitignoreбули оновлені так, що " ignore=untracked" більше не потрібні, їх можна буде видалити).
Також перемикання гілок матиме ефект миттєво, якщо ignoreзапис ' ' в .gitmodulesрізних між гілками.


Ще один підхід до створення статусу git (або будь-якої команди git) для ігнорування певного підмодулю доступний у Git 2.13 (Q2 2017):

git config submodule.<name>.active false

Детальніше див. У розділі " Ігнорувати нові коміти для підмодуля git ".


Я оновив питання бітом gitconfig. Просто пінг, якщо ви знаєте відповідь.
кч

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

@drozzy: як ви згадуєте в іншому коментарі: " ignore = dirty"
VonC

1
@drozzy: Я запросив і доповнив відповідь nilshaldenwang додатковим параметром config "ignore = брудний", я відредагував офіційну відповідь, додавши посилання на повідомлення nilshaldenwang.
VonC

Дякую, нічого особистого, але я просто хотів більш корисної відповіді вгорі, яку я спочатку пропустив!
Андрій Дроздюк

11

Ви також можете використовувати

% git config [--global] submodule.ignore dirty

встановити submodule.ignore = dirtyу своєму .git/configфайлі. --globalвстановить прапор ігнорування у вашому ~/.gitconfigі буде застосовано до всіх ваших сховищ. Без нього він повинен увійти.git/config лише на репо, де ви зараз перебуваєте.

Єдину документацію, яку я можу знайти на цьому, - submodule.<name>.ignoreце документи git-config . Я перемістив його з файлу .gitmodules у мій ~ / .gitconfig, і він все ще працює для мене.


@ PawełGościcki Я можу підтвердити, що він працює на Git 2.0.0.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

6

Вам потрібно додати

ігнорувати = брудно

до .gitmodules


Де в .gitmodules ви додаєте його?
Андрій Дроздюк

@drozzy Ви додаєте його під розділ для кожного підмодуля, який ви хочете ігнорувати, де визначені значення "шлях" та "URL".
jsdalton

2

Отже, у git v1.7.2-rc2 є те, що я хочу:

$ git diff --ignore-submodules = брудний постачальник
# немає виводу
$ git status --ignore-підмодулі = брудний постачальник
# На гілці…
нічого не робити (чистий робочий каталог)

Створення власного як git:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html

1
Я відрахувати сім мерзотників тут: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen

2

Я відповів тут на це питання детальніше.

Просто біжи

git config --global diff.ignoreSubmodules dirty

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


1

Ви не можете додати ignore = dirtyдо .gitmodules, Ви можете бути більш виборчим про зміни ви хотіли ігнорувати.

Для цього додайте шаблони до .git/submodule_foo/bar/info/exclude, де submodule_foo/bar/знаходиться шлях підмодуля.

Шаблони схожі на шаблони, які ви додали б .gitignore, при цьому корінь - каталог підмодулів. Наприклад, цей шаблон ігнорує buildкаталог у підмодулі submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/

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