Як я можу зупинити показ .gitignore від появи у списку не відстежених файлів?


971

Я щойно зробив git initкорінь свого нового проекту.

Потім я створив .gitignoreфайл.

Тепер, коли я набираюgit status , .gitignore файл відображається у списку файлів , які не відстежуються . Чому так?


13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Аластер

1
Чи можу я проігнорувати папку .git / і помістити її в ".gitignore"?
Тимо

2
Ви можете створити глобальний "gitignore" у своїй домашній папці під Linux і зберегти його там: git config --global core.excludesfile ~ / .gitignore_global
Timo

14
Я прийшов сюди, шукаючи, how to gitignore .gitinore fileа запитання та прийнята відповідь насправді не пов’язані із заголовком. Назва може бути покращена.
m.rufca

6
Існують випадки використання для ігнорування .gitignore. Робочий процес моєї команди вимагає від мене змінити набір файлів для мого локального середовища розробки, але вони не повинні виконуватись. Робочий процес можна було б покращити за допомогою кращої архітектури, але це не в моїх руках. Тим часом, git звернути увагу на ці файли - це відповідальність. Таким чином, я хочу їх окуповувати, але лише локально, і я не хочу ризикувати вчиненням .gitignore, оскільки його не слід ділитися з командою.
Марк

Відповіді:


959

.gitignoreФайл повинен бути у вашому сховищі, так що на насправді повинні бути додані і вчинені в, як і git statusпередбачає. Він повинен бути частиною дерева сховища, щоб зміни до нього можна було об'єднати тощо.

Отже, додайте його до свого сховища, воно не повинно бути оскарженим.

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

Дивіться також https://help.github.com/articles/ignoring-files


17
Чи не повинно це бути частиною метаданих сховища, а не відстежуваним файлом?
ендоліт

13
Метадані репозиторію є локальними для сховища. Якщо ви додасте гак для фіксації до репо, і хтось клонує ваше репо, наприклад, він не отримає гачок для здійснення.
Серпень Ліллеас

91
@wukong, якщо ви працюєте в команді, чи не повинні всі ігнорувати один і той же набір файлів? Тому файл .gitignore додається до сховища. Ніхто не каже, що вам потрібно розгорнути його як частину свого проекту.
Райан Лунді

13
@endolith and wukong Це не повинно бути файлом у вашому репо. Ви можете налаштувати ігнорування у багатьох місцях. У GitHub є чудова стаття про це help.github.com/ignore-files Ви можете мати глобальні налаштування ігнорування в будь-якому місці, і ви можете мати конкретні параметри в метаданих .git для репо.
Бушлі

6
@ deed02392 Використовуючи ці файли ігнорування, ви, звичайно, повинні використовувати судження в тому, що ви вкладаєте в них, але вони все ще мають велике використання. Наприклад, я використовую Vim і так у своєму глобальному gitignore у мене є * .swp файли, позначені як ігноровані. Таким чином, я не повинен додавати його до кожного свого проекту, і хлопці, які ніколи не використовують vim, не повинні турбуватися про це.
Бушлі

282

Якщо ви хочете зберігати список ігнорованих файлів поза вашим деревом Git, ви можете використовувати .git / info / виключити файл. Він застосовується лише до оформлення замовлення репо.


19
+1, це чудово підходить для ігнорів, які не стосуються проектів, таких як файли резервного копіювання emacs * ~, .DS_Store з OS X тощо.
Серпень Ліллеас

38
@AugustLilleaas Я особисто вважаю за краще вводити такі типи {редактор, платформа} -специфічні файли, ~/.gitignoreщоб вони ігнорувалися для будь-якого сховища, над яким я працюю.
Майкл Міор

22
Після відстеження файлу ви можете git update-index --assume-unchanged <file>зупинити відстеження змін без зміни репо- файлу . Це дуже корисно для великих спільних проектів, де вам потрібно внести зміни на місцевому рівні, але ніхто більше не хоче бачити ваші речі, присвячені репо. Дивіться blog.pagebakers.nl
Кріс Есплін

6
@AugustLilleaas: Гітігнор для користувачів краще для цього випадку.
Механічний равлик

3
дякую за цю пораду, я використовую git-svn, тому інші користувачі svn repo на сервері точно не хочуть .gitignore зареєстровано.
enorl76

74

Насправді ви можете помістити рядок .gitignoreу свій .gitignoreфайл. Це призведе .gitignoreдо ігнорування файлу git. Я насправді не думаю, що це гарна ідея. Я думаю, що файл ігнорування повинен контролюватися і відслідковуватися. Я просто викладаю це для повноти.


7
Працювали для мене! версія 1.5.6.5. Я також погоджуюсь з ІНФОРМАЦІєю 1800 р., Що це не дуже гарна ідея, але я думаю, що це може бути добре в певних контекстах (скажімо, ви використовуєте сховище git-svn, і ви не хочете, щоб файли git-ish переходили до svn). Файл, що виключає, мабуть, краще.
Дж. Полфер

4
@ehsanul - файл не повинен відслідковуватися (ви не повинні його додавати чи коментувати). Ви можете його відстебнути. Це, мабуть, не чудова ідея в середовищі, що використовується лише для git, але якщо у вас трапляється, наприклад, використовувати git як розумний клієнт для сховища субверсії (не знаючи іншого, <маніакальний сміх>) - така хитрість чудова.
Томаш Гандор

2
@IshanSrivastava Напевно файл уже відстежено. Спробуйте запуститиgit rm --cached .gitignore
Гедеон

51

Ви також можете мати глобальний користувацький .gitignoreфайл git, який автоматично застосовуватиметься до всіх ваших репост. Це корисно для IDE і редактор файлів (наприклад , swpі *~файли для Vim). Змініть розташування каталогів відповідно до вашої ОС.

  1. Додати у свій ~/.gitconfigфайл:

    [core]
    excludesfile = /home/username/.gitignore
    
  2. Створіть ~/.gitignoreфайл із шаблонами файлів, які слід ігнорувати.

  3. Збережіть свої крапкові файли в іншому репо, щоб мати резервну копію (необов’язково).

Щоразу, коли ви копіюєте, ініціюєте чи клонуєте репо, буде використаний і ваш глобальний файл gitignore.


6
Я вважаю, що це найкраще рішення для ситуацій, коли ваші редактори залишають після себе тимчасові файли, наприклад. *. Swp (VIM) та ._ * (TM), оскільки не має сенсу постійно додавати ці правила до кожного git repo, і змусити інших користувачів з різними IDE перевірити ці файли.
Томас Хантер II

1
Це чудово працює для ігнорів, які не слід підштовхувати до будь-якої гілки. Замініть "ім'я користувача" власним іменем користувача, звичайно, і не додайте другий розділ [core] до .gitconfig, якщо він у вас уже є - просто розмістіть рядок excelsfile під існуючим розділом [core].
наждак

47

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

git update-index --assume-unchanged .gitignore

Джерело .


5
Погана ідея, причина .git/info/excludesє.
Arrowmaster

6
Я припускаю, що існує і причина --assume-unchanged. Чому один кращий за іншого?
Лейф Грюнвольдт

9
І btw .git/info/excludesне працює, якщо файл уже відстежується.
Лейф Грюнвольдт

Це справді допомогло мені з .gitignore, яка вже була вчинена і щодо якої я не хотів вносити змін. Я запускаю git 1.7.4.1 від Ubuntu 11.04 repos, а довідкові сторінки додають це до оновлення-індексу. "Цей параметр також може бути використаний як грубий механізм рівня файлів, щоб ігнорувати неспроможні зміни відслідковуваних файлів (подібні до того, що .gitignore робить для не відстежуваних файлів). Git не вдасться (витончено) у випадку, якщо потрібно змінити цей файл в індексі наприклад, при об'єднанні у коміт; таким чином, у випадку, якщо припущений-відслідкований файл буде змінено вище за потоком, вам потрібно буде обробити ситуацію вручну. "
YonahW

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

37

Після того, як ви додасте .gitignoreфайл і зробите його, він більше не відображатиметься у списку "файли без відстеження".

git add .gitignore
git commit -m "add .gitignore file"
git status

20

Просто у випадку, якщо хтось інший болить, як у нас. Ми хотіли виключити файл, який уже було зроблено.

Ця публікація була набагато кориснішою: занадто пізно працювати з .git / info / виключити

Зокрема, потрібно ігнорувати файл - це фактично використовувати команду git remove See git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html )

ви перевірите це, перейшовши

git rm --dry-run *.log
(якщо ви скажете, що хочете виключити всі файли журналу)

це виведе те, що було б виключено, якби ви його запустили.

тоді

ти запускаєш його, йдучи

git rm *.log
(або будь-який шлях до назви файла / вираз, який ви хочете)

Потім додайте *.logрядок у .gitignoreфайл.


4
Звичайно, ви можете продовжити це, додавши відповідні шаблони (наприклад, * .log) до свого .gitignore, щоб вони не захаращували вас, git statusякщо вони з’являться у майбутньому.
Патрік О'Лірі

2
Хоча моя проблема не була пов'язана з тим самим, що і в ОП: Дякую за те, що я повідомив мені, що мені потрібно буде використовувати RM для "очищення" мого репо після внесення змін у .gitignore (якщо файли вже зафіксовані.) Помилка Noob , Я знаю, але це було перше місце, коли я особисто бачив, щоб хтось це згадував.
Майк

Дякуємо за відгук. Так, саме тому я написав це, прийшовши сюди, а потім пройшовши довгий шлях, щоб це також розробити, подумав, що було б добре написати це. :)
Еволюція

16

Звичайно, файл .gitignore відображається у статусі, тому що він не відслідковується, а git сприймає це як новий смачний файл для їжі!

Оскільки .gitignore - це файл без відстеження, він може ігнорувати git, коли ви поміщаєте його в .gitignore!

Отже, відповідь проста: просто додайте рядок:

.gitignore # Ignore the hand that feeds!

у ваш файл .gitignore!

І, всупереч відповіді Августа, я мушу сказати, що справа не в тому, що файл .gitignore повинен бути у вашому сховищі. Просто буває, що це може бути, що часто зручно. І це, мабуть, правда, що саме тому .gitignore був створений як альтернатива .git / info / виключити, який не має можливості відстежувати сховище. У будь-якому випадку, як ви використовуєте ваш файл .gitignore, повністю залежить від вас.

Для ознайомлення ознайомтеся з маніпуляцією gitignore (5) на kernel.org.


15

Ідея полягає у тому, щоб у .gitignoreфайл помістити файли, специфічні для вашого проекту, та (як уже згадувалось) додати його до сховища. Наприклад , .pycі .oфайли, журнали , що Тести створюють деякі світильники і т.д.

Для файлів .swp, створених вашою власною установкою, але які не обов'язково відображатимуться для кожного користувача (наприклад, файли, якщо ви використовуєте vim, приховані каталоги ecplise тощо), слід використовувати .git/info/exclude(як уже згадувалося).


14

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

(TL; DR: зафіксувати .gitignoreфайл і використовувати глобальну.gitignore для ігнорування файлів, створених вашою IDE або операційною системою)

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

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

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

  • Файли та папки, створені вашою операційною системою або IDE, слід розміщувати в глобальному масштабі.gitignore . Перевага полягає в тому, що це .gitignoreзастосовується до всіх сховищ на вашому комп'ютері, тому вам не доведеться повторювати це для кожного сховища. І це не поділяється з іншими розробниками, оскільки вони можуть використовувати іншу операційну систему та / або IDE.
  • Файли, які не належать ні до проекту .gitignore, ні до глобального .gitignore, не можна ігнорувати, використовуючи явні виключення сховища вyour_project_directory/.git/info/exclude . Цей файл не надаватиметься спільним іншим розробникам, а специфічний для цього одного сховища

Приємна згадка для глобальних.gitignore
Gruber

Я думаю, що після початкового налаштування файл .gitignore слід ігнорувати, тому випадкових змін немає. Це не означає, що його більше не можна змінювати, але він захищений від нещасних випадків. Аварії на цьому файлі можуть ввести в замішання або навіть загрожувати певній роботі, тому слід також враховувати «герметизацію» (ігнорування самого себе).
Саса

@Sasa .gitignoreпрацює лише для ігнорування файлів, які ще не відстежуються Git. Додавання вже відстеженого файлу .gitignoreне завадить вносити зміни до цього файлу. Навіть якби це було можливо, як би ви скоїли зміни, .gitignoreколи він доручить Git ігнорувати себе?
Нік Уортел

@ Nic - детальне пояснення я передав моїй точці зору в окремій відповіді @ внизу цієї теми.
Саса

12

Слідкуйте за наступною "проблемою" Іноді ви хочете додати каталоги, але файлів у цих каталогах немає. Просте рішення - створити .gitignore із таким вмістом:

*

Це шви справно працюватимуть, поки ви не зрозумієте, що каталог не додано (як очікувалося у ваше сховище. Причина цього в тому, що .gitignore також буде проігноровано, і тим самим каталог буде порожнім. Таким чином, вам слід зробити щось подібне :

*
!.gitignore

9

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

оновити цей файл

.git/info/exclude 

зі своєю підказкою або ім'ям файлу

*pyc
*swp
*~

5

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

Спробуйте скористатися цією командою:

git update-index --assume-unchanged FILENAME_TO_IGNORE

Щоб змінити його назад (якщо ви хочете колись змінити його), використовуйте:

git update-index --no-assume-unchanged

ОНОВЛЕННЯ :

Ось як перелічити файли "припустити незмінні" у поточному каталозі:

git ls-files -v | grep -E "^[a-z]"

Як -vваріант буде використовувати малі літери для «припустимо незмінні» файли.


4

У моєму випадку я хочу виключити існуючий файл. Лише модифікація .gitignore не працює. Я дотримувався цих кроків:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

Таким чином я очистив з кешу файл, який хотів виключити, і після того, як додав його до .gitignore .


найкраще рішення для мене. ви також можете використовувати git add. по-друге, після цього git commit -m "fixing .gitignore"
мозковий масив

3

Перейдіть до базового каталогу вашого git repo та виконайте таку команду:

echo '\\.*' >> .gitignore

Усі файли крапок будуть ігноровані, включаючи цей прискіканий .DS_Store, якщо ви перебуваєте на Mac.


4
Я б цього не робив. Можливо, потрібні точкові файли. Натомість я просто додав би .gitignore та .DS_Store буквально.
Едвард Фолк

2

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


1

.gitignore- це ігнорування інших файлів. git - це про файли, тобто про ігнорування файлів. Однак, оскільки git працює з файлами, цей файл повинен бути там як механізм для переліку інших імен файлів.

Якби його називали .the_list_of_ignored_files це може бути трохи очевидніше.

Аналогія - це список предметів, які ви НЕ хочете робити. Якщо ви їх десь не перерахуєте, це якийсь список «завдань», про який ви не знатимете.


1

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

Однак є сила, яка має намір внести нестандартні зміни у .gitignoreфайл. The.gitignoreФайл може бути додатково змінений безвідповідальною людиною, помилково, з допомогою інструменту , який використовується, або в якому - небудь іншому випадку.

Для протидії цьому ми можемо зробити наступне:

  1. Початковий .gitignore повинен відображати умовність у колективі,
  2. Після його натискання .gitignore слід забезпечити, додавши запис .gitignore і натисніть цю зміну знову. .gitignoreФайл " запечатаний " таким чином.

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

На жаль, ви не можете бути на 100% захищені від дурості, але таким чином ви зробили все можливе, щоб не допустити дурних речей.

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

Корисно використовувати .git/info/exclude, коли ви нічого не можете зробити щодо налаштувань інфраструктури, просто прикривши свій **, щоб не помилитися.

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


0

Я виявив, що найкраще місце, щоб налаштувати ігнорування на прикрі .DS_Storeфайли, - це .git/info/excludeфайл.

Здається, IntelliJ робить це автоматично, коли ви налаштуєте в ньому сховище git.


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