Как игнорировать определенные файлы в Git


731

У меня есть хранилище с файлом Hello.java. Когда я его компилирую, создается дополнительный Hello.classфайл.

Я создал запись для Hello.classв .gitignoreфайле. Тем не менее, файл по-прежнему отслеживается.

Как я могу заставить Git игнорировать Hello.class?


8
Что вы имеете в виду "это не работает"? Возможно, вы уже добавили Hello.class в свой репозиторий? gitignores не влияют на уже отслеженный контент. См., Например, stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel

Ответы:


810

Проблема в том, что .gitignoreигнорируются только файлы, которые не отслеживались ранее (пользователем git add). Запустите, git reset name_of_fileчтобы удалить файл и сохранить его. Если вы хотите также удалить данный файл из хранилища (после нажатия), используйте git rm --cached name_of_file.


190
Команда git rm --cached name_of_fileудалит файл из вашего git-репо. Даже если вы добавите его в свой файл .gitignore. Это не игнорирование того, что удаляет.
ОруэллХинденберг

4
Похоже, что OP хотел в этом случае.
Ондрей Слинтак

40
Я рад, что ваше решение сработало для @ Kohan95! Хотя этот вопрос следует переименовать на основе выбранного ответа. Мои комментарии являются лишь предупреждением для разработчиков, которые могут не знать, что делает команда.
Оруэлл Хинденберг,

91
git reset name_of_fileудаляет отслеживание и не удаляет файл.
Сис Тиммерман

7
Пробовал git rm --cached <name_of_file> Он действительно удалил файл в репозитории, но, поскольку он был в файле .gitignore, локальная копия не была удалена. В качестве дальнейшего примечания, чтобы добавить каталог, вам нужно добавить его через косую черту «/». Я удалял каталог конфигурации Rubymine в проекте ruby, который кто-то зарегистрировал, который был ".idea". В файле я помещаю «.idea /», а затем «git rm --cached -r .idea», чтобы удалить каталог и все, что в нем находится (потому что git только версии файлов, а не каталогов.)
Дуг Ноэль

222

Как игнорировать новые файлы

глобально

Добавьте путь (и) к вашему файлу (файлам), который вы хотели бы игнорировать к своему .gitignoreфайлу (и зафиксируйте их). Эти записи файла будут также применяться к другим, проверяющим хранилище.

в местном масштабе

Добавьте пути к вашим файлам, которые вы хотели бы игнорировать в своем .git/info/excludeфайле. Эти записи файла будут применяться только к вашей локальной рабочей копии.

Как игнорировать измененные файлы (временно)

Чтобы игнорировать измененные файлы, чтобы они отображались как измененные, вы можете использовать следующую команду git:

git update-index --assume-unchanged <file>

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

git update-index --no-assume-unchanged <file>

Идеально подходит для предотвращения вставки файла, содержащего текущий ключ API, в GitHub!
Джим в Техасе

1
@Xman Почему ты сказал, что это временно? Я выполнил шаги, которые вы упомянули для localgit ignore, и перезапустил мою систему, она по-прежнему показывает работу напрямую в чистоте.
Вивек Вардхан

1
Спасибо за полезный update-indexтрюк, абсолютно идеальный, чтобы избежать изменения .gitignoreфайла, который затем отслеживается Git!
Томас П.

@mcbjam Специальной команды git ignore не существует. Отредактируйте файл .gitignore, расположенный в соответствующем месте рабочей копии. Затем вы должны добавить этот .gitignore и зафиксировать его. Каждый, кто клонирует это репо, будет игнорировать эти файлы.
Xman Classical

@Vivek Vardhan git update-index --assume-неизмененный подобен временной маске в индексе. Он останется в силе, пока вы его не выключите. Чтобы сделать мою точку зрения более ясной, индекс изначально (то есть сразу после git read-tree) «содержит» все файлы из tree-ish, которые только что были прочитаны. Следовательно, заставляя Git «закрывать глаза» на индексная запись не равна фактическому удалению.
Xman Classical

150

Добавьте следующую строку в .gitignore:

/Hello.class

Это исключит Hello.class из git. Если вы уже зафиксировали его, выполните следующую команду:

git rm Hello.class

Если вы хотите исключить все файлы классов из git, добавьте следующую строку в .gitignore:

*.class

32
Добавление Hello.classк .gitignoreбудет игнорировать любой файл, вызванный Hello.classв любом подкаталоге. Если вы намереваетесь игнорировать файл только Hello.classв том же каталоге, что и .gitignoreфайл, используйте /Hello.classвместо него строку.
ndim

Где вы положили .gitignoreфайл?
CodyBugstein

6
@ Я могу поместить его в .gitignoreлюбом месте git-проекта - если путь начинается с /, он будет относительно местоположения .gitignoreфайла; в противном случае он будет ссылаться рекурсивно на файлы в текущем каталоге и его дочерних каталогах.
Арманд

109

1) Создать .gitignoreфайл. Для этого просто создайте .txtфайл и измените расширение следующим образом:

Введите описание изображения здесь

Затем вы должны изменить имя, написав следующую строку в окне cmd:

 rename git.txt .gitignore

Где git.txtимя файла, который вы только что создали.

Затем вы можете открыть файл и записать все файлы, которые вы не хотите добавлять в хранилище. Например, мой выглядит так:

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

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

Затем в Git Bash вы должны написать следующую строку:

git config --global core.excludesfile ~/.gitignore_global

Если хранилище уже существует, вы должны сделать следующее:

  1. git rm -r --cached .
  2. git add .
  3. git commit -m ".gitignore is now working"

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


Вы можете использовать команду «copy con .gitignore» в командной строке и затем нажать CTRL + Z, чтобы напрямую создать файл без проводника Windows.
Heringer

61

Игнорировать:

git update-index --assume-unchanged <path/to/file>

Чтобы отменить игнорировать:

git update-index --no-assume-unchanged <path/to/file>

6
Я хотел бы, чтобы это было вершиной диаграммы как решение проблемы .... Это очень просто и элегантно
user1457958

«Это очень просто и элегантно» - не совсем : «Предположим, без изменений нельзя злоупотреблять механизмом игнорирования. Это «Я знаю, что моя файловая система работает медленно. Я обещаю Git, что я не буду менять эти пути ...» Особенно, это не обещание… что Git всегда будет считать, что эти пути не изменены - если Git может определить путь … Изменился без дополнительных lstat(2)затрат, он оставляет за собой право сообщить, что путь был изменен (… git commit -aсвободен совершать это изменение). '
Крис

47

Вы можете использовать методы ниже, чтобы игнорировать / не игнорировать изменения в отслеживаемых файлах.

  1. Для игнорирования: git update-index --assume-unchanged <file>
  2. Для возврата игнорируемых файлов: git update-index --no-assume-unchanged <file>

4
Это относится ко всем файлам? Неясно, как эти команды могут быть применены только к одному файлу, чтобы игнорировать / игнорировать его.
Джавадба

@kapil наконец !! то, что на самом деле работает среди триллионов вариантов команды git! Пытался каждый ответ игнорировать некоторые глупые файлы build.xml, которые появлялись после каждой сборки ... спасибо!
killjoy

1
Пожалуйста, не говорите: «Предположим, что без изменений нельзя злоупотреблять механизмом игнорирования. Это «Я знаю, что моя файловая система работает медленно. Я обещаю Git, что я не буду менять эти пути ...» Особенно, это не обещание… что Git всегда будет считать, что эти пути не изменены - если Git может определить путь … Изменился без дополнительных lstat(2)затрат, он оставляет за собой право сообщить, что путь был изменен (… git commit -aсвободен совершать это изменение). '
Крис

22

Создайте .gitignoreв каталоге, где находится .git. Вы можете перечислить файлы в нем, разделенные новой строкой. Вы также можете использовать подстановочные знаки:

*.o
.*.swp

3
Рекомендуется избегать размещения шаблонов, специфичных для инструментов (например, ваших временных файлов Vim), в .gitignoreфайлах (если этот инструмент не предусмотрен проектом). Вы можете поместить шаблоны для ваших любимых инструментов в файл исключений для каждого пользователя (набор core.excludesFile); они будут работать во всех ваших репозиториях. Например git config --global core.excludesFile "$HOME/.git-user-excludes", затем поместите их в этот файл.
Крис Джонсен

@ Крис: Спасибо за совет. Но я просто написал это там, потому что ничто не пришло мне в голову :)
конец

1
@ChrisJohnsen "инструмент конкретного? для VIM ?? Я думаю, что это безопасно исключить файлы Vim Swap ..
Джавадба

16

С официального сайта GitHub:

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

git rm --cached FILENAME

или

git rm --cached .

12

Вы должны написать что-то вроде

*.class

в ваш .gitignoreфайл.


4
@AgentZebra Вы должны добавить запись *.classв свой файл, .gitignoreчтобы git игнорировал все файлы, заканчивающиеся на .class.
KingCrunch

7

Добавьте, какие файлы вы хотите игнорировать в файл .gitignore:

*.учебный класс

* .projects

* .prefs

* .project



5

Если вы уже зафиксировали файл и пытаетесь игнорировать его, добавляя в .gitignoreфайл, Git не будет игнорировать его. Для этого сначала нужно сделать следующее:

git rm --cached FILENAME

Если вы только начинаете проект и хотите добавить некоторые файлы в Git ignore, выполните следующие шаги, чтобы создать файл Git ignore:

  1. Перейдите в свой репозиторий Git.
  2. Введите «touch .gitignore», чтобы создать .gitignoreфайл.

3

Вы также можете использовать .gitattributes (вместо .gitignore) для исключения целых типов файлов. Файл довольно понятен, но я вставляю содержимое здесь для справки. Обратите внимание на последнюю строку (двоичный файл * .class):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary


2

У меня была похожая проблема с файлом "dump.rdb".
Я пытался добавить этот файл различными способами в файл .gitignore, но сработал только один способ.

Добавьте свое имя файла в конце файла .gitignore

ПРИМЕЧАНИЕ. Добавление файла в другом месте не работает.

Например, см .: https://gitlab.com/gitlab-org/gitlab-ce/raw/b3ad3f202478dd88a3cfe4461703bc3df1019f90/.gitignore


2

Эта веб-страница может быть полезной и экономящей время при работе с .gitignore.

Он автоматически генерирует файлы .gitignore для различных IDE и операционных систем с конкретными файлами / папками, которые вы обычно не хотите извлекать в свой репозиторий Git (например, специфичные для IDE папки и файлы конфигурации).


1

Я попробовал это -

  1. список файлов, которые мы хотим игнорировать

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. Скопируйте содержимое шага # 1 и добавьте его в файл .gitignore.

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. Validate

git status .gitignore

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


1
  1. Перейдите к файлу .gitignore и добавьте запись для файлов, которые вы хотите игнорировать
  2. Запустить git rm -r --cached .
  3. Теперь беги git add .

0

Я пробовал --assume-unchangedи тоже, .gitignoreно ни один не работал хорошо. Они затрудняют переключение веток и затрудняют объединение изменений от других. Это мое решение:

Когда я фиксирую , я вручную удаляю файлы из списка изменений

Прежде чем вытащить , я прячу измененные файлы. И после тяги я делаю трещотку .

  1. мерзавец
  2. мерзавец
  3. Git Stash поп

Шаг 3 иногда вызывает слияние и может привести к конфликту, который вам нужно разрешить, что является хорошей вещью.

Это позволяет мне сохранять локальные изменения, которые не доступны другим в команде.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.