Как я могу остановить .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 их, но только локально, и я не хочу рисковать совершением моего .gitignore, так как он не должен передаваться команде.
Марк

Ответы:

959

.gitignoreФайл должен быть в вашем хранилище, так что на самом деле должны быть добавлены и совершенные в, как и git statusпредполагает. Он должен быть частью дерева хранилища, чтобы его можно было объединить и так далее.

Итак, добавьте его в свой репозиторий, он не должен быть проигнорирован.

Если вы действительно хотите, вы можете добавить .gitignoreв .gitignoreфайл, если вы не хотите, чтобы он был зафиксирован. Однако в этом случае, вероятно, лучше добавить игнорирование в .git/info/excludeспециальный локальный файл checkout, который работает так же, как .gitignore, но не отображается в «git status», поскольку он находится в .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 / exclude . Он применяется только к вашей кассе репо.

Павел Хайдан
источник
19
+1, это отлично подходит для игнорирований, не связанных с проектом, таких как файлы резервных копий emacs * ~, .DS_Store из OS X и так далее.
Август Лиллеас
38
@AugustLilleaas Я лично предпочитаю помещать эти типы специфичных для {editor, platform} файлов, ~/.gitignoreчтобы они игнорировались для любого репозитория, над которым я работаю.
Майкл Миор
22
После того, как файл отслежен, вы можете использовать, git update-index --assume-unchanged <file>чтобы остановить отслеживание изменений без изменения репо. Это очень полезно в больших общих проектах, где вам нужно вносить локальные изменения, но никто больше не хочет, чтобы ваши вещи были привязаны к репо. Смотрите blog.pagebakers.nl
Крис Эсплин
6
@AugustLilleaas: Gitignore для пользователя лучше для этого варианта использования.
Механическая улитка
3
спасибо за этот совет, я использую git-svn, поэтому другие пользователи репозитория svn на сервере не захотят регистрироваться .gitignore.
enorl76
74

Вы можете вставить строку .gitignoreв ваш .gitignoreфайл. Это приведет к тому, что .gitignoreфайл будет игнорироваться git. Я на самом деле не думаю, что это хорошая идея. Я думаю, что файл игнорирования должен контролироваться версией и отслеживаться. Я просто выкладываю это для полноты.

1800 ИНФОРМАЦИЯ
источник
7
Работал на меня! версия 1.5.6.5. Я также согласен с 1800 ИНФОРМАЦИЕЙ, что это не очень хорошая идея, но я думаю, что это может быть хорошо в определенных контекстах (скажем, вы используете репозиторий git-svn и не хотите, чтобы файлы git-ish переходили в svn). Файл исключений, вероятно, лучше.
Дж. Полфер
4
@ehsanul - файл не должен отслеживаться (вы не должны были добавлять или фиксировать его). Вы можете отследить это. Вероятно, это не очень хорошая идея в среде только для git, но если вам случится, например, использовать git в качестве интеллектуального клиента для хранилища Subversion (без ведома остальных, <маниакальный смех>) - такой трюк хорош.
Томаш Гандор
2
@IshanSrivastava Возможно, файл уже отслежен. Попробуй бегиgit rm --cached .gitignore
Гедеон
51

У вас также может быть глобальный пользовательский git- .gitignoreфайл, который будет автоматически применяться ко всем вашим репозиториям. Это полезно для IDE и файлов редактора (например, swpи *~файлов для Vim). Измените расположение каталогов в соответствии с вашей ОС.

  1. Добавить в ваш ~/.gitconfigфайл:

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

  3. Сохраните ваши точечные файлы в другом репо, чтобы у вас была резервная копия (необязательно).

Каждый раз, когда вы копируете, инициализируете или клонируете репо, ваш глобальный файл gitignore также будет использоваться.

Алек Компьютерщик
источник
6
Я считаю, что это лучшее решение для ситуаций, когда ваши редакторы оставляют временные файлы, например. *. Swp (VIM) и ._ * (TM), так как не имеет смысла постоянно добавлять эти правила в каждое git-репо, и заставить других пользователей с разными IDE проверять эти файлы.
Томас Хантер II
1
Это прекрасно работает для игнорирования, которое не должно быть передано ни одной ветви. Замените 'username' на ваше фактическое имя пользователя, конечно, и не добавляйте второй раздел [core] в .gitconfig, если он у вас уже есть - просто поместите строку excludefile под существующим разделом [core].
Эмери
47

Если кто-то уже добавил .gitignoreв ваш репозиторий, но вы хотите внести в него некоторые изменения и игнорировать эти изменения, сделайте следующее:

git update-index --assume-unchanged .gitignore

Источник .

Лейф Грюнвольдт
источник
5
Плохая идея, причина .git/info/excludesсуществует.
Arrowmaster
6
Я полагаю, что есть причина --assume-unchangedтоже. Почему один лучше другого?
Лейф Грюнвольдт
9
И кстати .git/info/excludesне работает, если файл уже отслеживается.
Лейф Грюнвольдт
Это действительно помогло мне с уже созданным .gitignore, для которого я не хотел вносить изменения. Я запускаю git 1.7.4.1 из репозиториев Ubuntu 11.04 и страницы помощи добавляют это в update-index. «Эту опцию можно также использовать как грубый механизм на уровне файлов, чтобы игнорировать незафиксированные изменения в отслеживаемых файлах (аналогично тому, что .gitignore делает для неотслеживаемых файлов). Git завершится неудачно (изящно), если ему потребуется изменить этот файл в индексе например, при слиянии в коммите; таким образом, в случае, если предполагаемый неотслеживаемый файл изменяется в восходящем потоке, вам нужно будет обработать ситуацию вручную. "
YonahW
Я голосую за этот ответ, потому что обычно вам нужно это действие для начального состояния основного репо и сохранить преимущества функциональности git. Нет веских причин игнорировать этот файл (период)
Лазарос Космидис
37

После добавления .gitignoreфайла и его фиксации он больше не будет отображаться в списке «неотслеживаемых файлов».

git add .gitignore
git commit -m "add .gitignore file"
git status
Грег Хьюгилл
источник
20

Просто если кто-то другой испытывает ту же боль, что и мы. Мы хотели исключить файл, который уже был зафиксирован.

Этот пост был намного полезнее: работать с .git / info / исключить слишком поздно

В частности, чтобы игнорировать файл, на самом деле используйте команду git remove. См. Git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html. ).

Вы проверяете это, идя

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

это выведет то, что было бы исключено, если вы запустите его.

тогда

вы запускаете это, идя

git rm *.log
(или любой путь к файлу / выражение, которое вы хотите)

Затем добавьте *.logстроку в ваш.gitignore файл.

Evolve
источник
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 / exclude, у которого нет возможности отслеживания в хранилище. В любом случае, как вы используете файл .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
Грубер
Я думаю, что после начальной настройки файл .gitignore следует игнорировать, чтобы не было случайных изменений. Это не значит, что его нельзя больше менять, но в некотором смысле защищено от несчастных случаев. Несчастные случаи в этом файле могут ввести в заблуждение или даже поставить под угрозу некоторую работу, поэтому следует учитывать и «запечатывание» (игнорирование самого себя).
Саша
@Sasa .gitignoreработает только для игнорирования файлов, которые еще не отслеживаются Git. Добавление уже отслеженного файла в .gitignoreне помешает вам внести изменения в этот файл. Даже если бы это было возможно, как бы вы зафиксировали изменение, .gitignoreкогда оно указывает Git игнорировать себя?
Ник Уортел
@Nic - подробное объяснение я передал своей точке зрения в отдельном ответе @ внизу этой темы.
Саша
12

Не упустите следующую «проблему». Иногда вы хотите добавить каталоги, но в них нет файлов. Простое решение - создать .gitignore со следующим содержимым:

*

Это работает нормально, пока вы не поймете, что каталог не был добавлен (как и ожидалось в вашем хранилище. Причина в том, что .gitignore также будет игнорироваться, и, следовательно, каталог пуст. Таким образом, вы должны сделать что-то вроде этого :

*
!.gitignore
Лабиринт
источник
9

Кажется, это работает только для вашего текущего каталога, Gitчтобы игнорировать все файлы из хранилища.

обновить этот файл

.git/info/exclude 

с вашим подстановочным знаком или именем файла

*pyc
*swp
*~
Naskov
источник
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"
brainray
3

Перейдите в базовый каталог вашего git repo и выполните следующую команду:

echo '\\.*' >> .gitignore

Все точечные файлы будут игнорироваться, включая этот надоедливый .DS_Store, если вы на Mac.

weffen
источник
4
Я бы не стал этого делать. Там могут быть точечные файлы, которые вам нужны. Вместо этого я бы просто добавил .gitignore и .DS_Store буквально.
Эдвард Фальк
2

Вполне возможно, что конечный пользователь хочет, чтобы Git игнорировал файл ".gitignore" просто потому, что определенные папки IDE, созданные Eclipse, вероятно, не совпадают с NetBeans или другой IDE. Таким образом, чтобы сохранить антагонистичность исходного кода в среде IDE, проще упростить пользовательское игнорирование git, которое не будет доступно всей команде, поскольку отдельные разработчики могут использовать разные IDE.

Джон Браун
источник
1

.gitignoreо игнорировании других файлов. Git о файлах, так что это о игнорировании файлов. Однако, поскольку git работает с файлами, этот файл должен быть в качестве механизма для перечисления других имен файлов.

Если бы это назвали, .the_list_of_ignored_filesэто могло бы быть немного более очевидным.

Аналогия - это список дел, которые вы НЕ хотите делать. Если вы не перечислите их где-нибудь, это какой-то список дел, о которых вы не узнаете.

Майкл Даррант
источник
1

Я думаю, что есть ситуации, когда игнорирование .gitignore очень полезно. Например, когда у вас есть несколько команд или большая команда, работающая над одной и той же кодовой базой. В этом случае вам нужно иметь определенные соглашения, одно из которых касается того, что игнорируется в git-репо. Обычно речь идет об игнорировании файлов и каталогов, созданных IDE или ОС, некоторых сгенерированных журналов и т. Д.

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

Чтобы противостоять этому, мы можем сделать следующее:

  1. Начальный .gitignore должен отражать соглашение в команде (ах),
  2. После его нажатия .gitignore должен быть защищен путем добавления записи .gitignore и снова нажать это изменение. Таким образом, .gitignoreфайл « запечатывается ».

« Запечатанный » .gitignoreфайл может быть изменен, только локально, без передачи этих изменений другим членам команды. Однако, если изменение широко согласовано во всей группе (ах), то его можно «распечатать», изменить и затем «запечатать» снова. Это не может быть сделано по ошибке, только намеренно.

К сожалению, вы не можете быть на 100% защищены от глупости, но таким образом вы сделали все возможное, чтобы избежать глупостей.

Если у вас относительно небольшая команда с очень хорошими профессионалами, это было бы неважно, но даже этим ребятам хотелось бы иметь одну вещь, о которой меньше беспокоиться.

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

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

Sasa
источник
0

Я обнаружил, что лучшее место для настройки игнорирования надоедливых .DS_Storeфайлов - это .git/info/excludeфайл.

Кажется, IntelliJ делает это автоматически, когда вы настраиваете в нем git-репозиторий.

Стивен Макконнелл
источник
1
Глобальный файл игнорирования пользователя будет лучшим местом для игнорирования .DS_Store
Max Nanasy