Gitignore игнорируется Git


1514

Мой .gitignoreфайл, кажется, игнорируется Git - возможно, .gitignoreфайл поврежден? Какой формат файла, локаль или культура ожидает Git?

Мой .gitignore:

# This is a comment
debug.log
nbproject/

Выход из git status:

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       debug.log
#       nbproject/
nothing added to commit but untracked files present (use "git add" to track)

Я хотел бы debug.logи nbproject/не появляться в списке неотслеживаемых файлов.

С чего мне начать искать это исправить?


56
Убедитесь, что ваш .gitignoreфайл использует ANSIили UTF-8кодировку. Если он использует что-то еще Unicode BOM, возможно, Git не может прочитать файл.
ADTC

8
@ADTC это была именно проблема на моей машине (Windows). Я использовал echo "file" > .gitignoreв PowerShell, файл имел кодировку UCS-2!
MarioDS

7
git rm --cached debug.log nbproject/
Гаян Виракутти

4
Почему первый комментарий здесь не является ответом за меня
RedOrav

2
@MattParkins Ах, я вижу это сейчас, меня все еще удивляет, что такой простой и конкретный ответ похоронен в качестве комментария или что фактически принятый ответ там внизу. Спасибо!
RedOrav

Ответы:


3123

Даже если вы еще не отслеживали файлы, Git, похоже, сможет «знать» о них даже после того, как вы добавите их в .gitignore.

ВНИМАНИЕ: Сначала зафиксируйте ваши текущие изменения, иначе вы их потеряете.

Затем выполните следующие команды из верхней папки вашего Git-репозитория:

git rm -r --cached .
git add .
git commit -m "fixed untracked files"

8
Я получил «use: git rm [options] [-] <file> ...» при попытке «git rm -r --cached». Если это имеет значение, я использую Git из PowerShell после нажатия «Инструменты-> Открыть оболочку здесь» в GitHub для Windows.
скоро

61
в Windows: git rm. -r - кэшировано и git add.
Beachhouse

90
Будьте внимательны, чтобы зафиксировать все ваши изменения раньше, иначе вы потеряете контроль над всеми измененными файлами !!
Космин

45
Первые 3 комментатора, кажется, пропустили точку в конце. Это означает каждый файл. "git -rm -r --cached." <- обратите внимание на точку.
Кристоф Де Тройер

18
Если вы не хотите коммитить, обходной путь - положить ваши изменения на полку: «git stash». Запустите вышеуказанные команды. и запустить "git stash pop"
Иван

335

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

  • Там может быть глобальный .gitignoreфайл, который может помешать вашему локальному
  • Когда вы добавляете что-то в файл .gitignore, попробуйте это:

    git add [uncommitted changes you want to keep] && git commit
    git rm -r --cached .
    git add .
    git commit -m "fixed untracked files"
    
  • Если вы удалили что-то из файла .gitignore, и описанные выше шаги могут не сработать, если вы обнаружили, что вышеуказанные действия не работают, попробуйте следующее :

    git add -f [files you want to track again]
    git commit -m "Refresh removing files from .gitignore file."
    
    // For example, if you want the .java type file to be tracked again,
    // The command should be:
    //     git add -f *.java
    

3
Возможно, вы могли бы отредактировать ответ @AlinHuruba, чтобы добавить свой шаг 3?
Бендж

@Benj Спасибо за ваш совет, я не нашел ответ AlinHuruba, я не знаю, в чем разница, поэтому, пожалуйста, скажите мне прямо.
ifeegoo

2
Шаг 3 - это то, что мне нужно. Большая часть ответа просто говорит, как удалить файл, который мы хотим отследить. Спасибо за противоположную точку зрения.
Yeung

Надеюсь, это поможет вам!
ifeegoo

7
git rm -r --cached .работал для меня
Джейсон

198

Исправлена. Хорошо, я создал файл .gitignore в Блокноте на Windows, и он не работал. Когда я просматривал файл .gitignore в Linux, он выглядел как организованный тарабарщина - возможно, Блокнот записал Unicode, а не ASCII или что-то еще 8-битное.

Таким образом, я переписал файл на своем компьютере с Linux, и когда я вернул его обратно в Windows, он отлично работает! Ура!


77
В блокноте просто выберите кодировку «ANSI» в диалоговом окне «Сохранить как». Или, что еще лучше, найдите подходящий текстовый редактор - ведь вы программист :) ... Я могу порекомендовать "Блокнот программиста", другие предпочитают Notepad ++, а их буквально сотни.
0xC0000022L

1
хе-хе, да, я должен был создать его в NetBeans (который я использовал в то время), Eclipse или Visual Studio. Я просто позвонил из командной строки, думая, что это ничего не изменит.
Мэтт Паркинс

8
Моя проблема была похожа - мой .gitignore использовал UTF8 с спецификацией . Просто сохранил его как UTF8 без спецификации, и он волшебным образом начал работать.
Фил

13
Это была и моя проблема. Я создал файл .gitignore с помощью «echo dirName> .gitignore», потому что Windows создает такую ​​боль при создании файлов, начинающихся с «.». Кодировка файла, созданного таким способом, была нечитаема для git, и вместо этого он интерпретировал его как двоичный файл. Нажал "Кодировка -> UTF-8" в Notepad ++, сохрани, готово.
Лора

4
У такой же проблемы, как у @Laura в powershell - файл по умолчанию сохраняется как UTF16.
mrówa

113

Без добавления еще одного коммита в ваш проект, одной строки будет достаточно, чтобы .gitignoreработать так, как предполагается:

git rm -r --cached debug.log nbproject

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


1
Работал именно так, как я хотел - у меня был только 1 файл, который не отслеживался должным образом. Я сохранил его содержимое в блокноте и сделал: git rm -r --cached someFile.phpи это сработало как шарм :)
ShayLivyatan

@FMFF Это удалит его из репозитория, но сохранит его физически, простым языком, удалит любую историю изменений, связанных с ними, а также не будет отслеживать их изменения в любом будущем коммите. Лучшее объяснение вы можете найти здесь: stackoverflow.com/questions/37279654/…
H Aßdøµ

Я получил «fatal: pathspec 'debug.log' не соответствует ни одному файлу»
Майкл,

45

Другая причина этой проблемы - пробелы или табуляции перед оператором:

Пример:

# Be aware of the following:
 notWorkingIgnore.*
workingIgnore.*

И, как указано в комментарии ниже, пробел также может быть проблемой:

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace

11
Моя проблема была с пробелом, который еще сложнее найти.
АСКУЭ

3
также была проблема с пробелами в конце.
Trefex

3
Да, здесь то же самое. Я думал , что я мог бы написать комментарии после шаблона файла: *.txt # Tex files. Но git понимает: «Игнорируйте файлы с расширением txt »
Адам Либуша

3
Мое слово, мне потребовалось 2 дня, чтобы найти ответ с 15 голосами. Это заслуживает большего.
fordcars

2
Вы только что решили проблему, которую я имел в течение нескольких месяцев ... Спасибо!
Arkellys

36

Я заметил, что кодирование .gitignoreимеет эффект - если файл был Unicode, он был проигнорирован, если это был ASCII, это не так.

Обработать:

  1. Проверить статус: PS> git status
  2. Создать функцию для Get-FileEncoding
  3. Тестовая .gitignoreкодировка:PS> Get-FileEncoding .gitignore
  4. Измените кодировку на ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. Подтверждение: PS> git status

5
1000 спасибо за это. Я создавал файл .gitignore на моей системе , используя touch .gitignoreи echo ".db" >> .gitignoreмаршрут через PowerShell. Я обнаружил, что echo ".db" >> .gitignore"установка кодировки файла на UCS-2 LE-BOM, быстрое преобразование в ASCII и gitignore начал работать.
B-Rad

2
Вы можете попробовать пропустив Шаг 2 и 3.
Аникет Бхансали

32

Как и с другими решениями, совершить первый и быть в курсе , что вы будете терять не-привержен изменения.

У меня были лучшие результаты с этим:

git rm -r --cached .
git reset HEAD --hard
git status

Обратите внимание, что статус не должен иметь никаких измененных файлов сейчас.


2
этот не работает для меня, но ответ ifeegoo делает
Фанни

21

В моем случае это потому, что файлы уже существуют в хранилище, и я пытаюсь это игнорировать.

Вот что я сделал, чтобы решить эту проблему:

  • Скопируйте файлы во временную папку
  • Удалите их из папки моего проекта.
  • Зафиксируйте изменения, которые удаляют эти файлы из хранилища
  • Повторно добавили эти файлы в папку моего проекта

К тому времени любые изменения, которые я внес в эти файлы, были проигнорированы.

Я думаю, что вы не можете игнорировать файлы, которые уже существуют в хранилище.


В моем случае они уже были поставлены. Только после того, как вы сделали то, что вы предлагаете, затем попытались зафиксировать и увидеть предупреждение о том, что они были поставлены и удалены, я понял, что это проблема.
dudeNumber4

19

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

echo .idea/ >> .gitignore
git init

Если вы разрабатываете ежедневно, я советую вам добавить ваши привычные игнорируемые файлы в ваш ~/.gitignore_globalфайл. Таким образом, gitвы уже будете знать, какие файлы вы (что означает «ваш пользователь», поскольку это файл в вашем домашнем каталоге) обычно игнорировать.


Слава богу ... наконец-то решение, которое работает для меня.
двухместное

~/.gitignore_globalнастраиваемое имя git config --global core.excludesfileСначала запустите, чтобы увидеть, определен ли уже файл. Если нет, беги git config --global core.excludesfile ~/.gitignore_global.
Ноумен

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

15

Также проверьте каталог, куда вы положили .gitignore.

Это должно быть в корне вашего проекта :

./myproject/.gitignore

Не в

./myproject/.git/.gitignore

9

Специально для пользователей Windows: если у вас есть неотслеживаемые файлы, а очистка / удаление кэшированных файлов не работает. Попробуйте открыть PowerShell и преобразовать файл .gitignore в кодировку UTF-8:

$Myfile = Get-Content .\.gitignore`
$Myfile | Out-File -Encoding "UTF8" .gitignore

Вам нужно сделать это только один раз, чтобы закодировать файл .gitignore для этого каталога, и, поскольку этот файл закодирован правильно, всякий раз, когда вы редактируете файл в будущем, он должен работать. Я полагаю, что это связано с тем, что GitHub не собирается читать не кодировку UTF-8 для файла .gitignore. Насколько я знаю, эта проблема еще не решена для Windows. Это не слишком большая сделка, просто отладка, когда она не работает.


8

.gitignoreМожет возникнуть другая проблема , особенно для пользователя Windows. Git не нравится, когда вы называете .gitignore(например, unity.gitignore).

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


7

Я только столкнулся с этой проблемой. Содержимое моего файла .gitignore продолжало появляться в списке неотслеживаемых файлов.

Я использовал это, чтобы создать файл игнорирования:

echo "node_modules" > .gitignore

Оказывается, двойные цитаты были причиной для меня. Я удалил файл игнорирования и затем снова использовал команду без кавычек, и она работала, как и ожидалось. Мне не нужно было связываться с кодировкой файлов. Я на машине с Windows 10, используя Cmder .

Пример:

echo node_modules > .gitignore

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

6

Для меня ни один из предыдущих ответов не сработал. Мне пришлось скопировать .gitignoreтекст в exclude.txtфайл, найденный на

<Your-project-folder>\.git\info

После этого обновите свои изменения, и все неотслеживаемые файлы исчезнут. Совершайте как обычно.


6

Моя проблема была (как предположил ОП) в поврежденном файле .gitignore. Я не верил в это и игнорировал эту возможность, пока все остальное не сработало. Повреждение не обнаружилосьvi , но в начале файла было два байта, из-за которых файл .gitignore был проигнорирован. Для меня они появились только тогда, когда я набрал текст cat .gitignore, который показал:

��# Built application files
*.apk
*.ap_

# ...

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

user@dev ~/project/myproject $ xxd -b .gitignore
00000000: 11111111 11111110 00100011 00000000 00100000 00000000  ..#. .
00000006: 01000010 00000000 01110101 00000000 01101001 00000000  B.u.i.

2
Это похоже на метку порядка байтов UTF-16 в файле в кодировке UTF-8. en.wikipedia.org/wiki/Byte_order_mark
jsageryd,

6

У меня была эта проблема с файлом .gitignore, содержащим эту строку:

lib/ext/

Я только что понял, что на самом деле этот каталог является символической ссылкой на папку где-то еще:

ls -la lib/ext/
lrwxr-xr-x 1 roipoussiere users 47 Feb  6 14:16 lib/ext -> /home/roipoussiere/real/path/to/the/lib

В lib/ext/действительности Git ищет папку , но символическая ссылка - это файл , поэтому моя libпапка не игнорируется.

Я исправил это, заменив lib/ext/на lib/extмой файл .gitignore.


5

У меня была такая же проблема. Я считаю, что проблема была в несоответствии между CR и CR + LF. Я спрятал вещи в моем .gitignore, используя CMD (в Windows 7) и следующую команду:

Плохой:

echo "file_to_be_ignored.py" >> .gitignore<br>
echo "*~" >> .gitignore

И т.п.

Проблема заключалась в том, что эта команда не помещает правильный маркер конца строки, чтобы Git распознавал символы новой строки (CR или CR + LF, когда Git ожидает другого). Я решил проблему, вручную заменив каждую новую строку в Vim (Vim на помощь!), И она отлично работала.

Попробуйте отредактировать ваш .gitignore в Notepad ++ или Vim (в идеале). Даже если файл выглядит правильно, попробуйте заменить символы новой строки. Это звучит странно, я знаю, но это сработало для меня. : D



3

Стоит также обратить внимание: сохраняете ли вы файл .gitignore с правильными окончаниями строк?

Окна:

Если вы используете его в Windows, сохраняете ли вы его с окончаниями строки Windows? Не все программы будут делать это по умолчанию; Notepad ++ и многие PHP-редакторы по умолчанию используют строки Linux, поэтому файлы будут совместимы с сервером. Один из простых способов проверить это - открыть файл в блокноте Windows. Если все отображается в одной строке, то файл был сохранен с окончанием строки Linux.

Linux:

Если у вас возникли проблемы с файлом, работающим в среде Linux, откройте файл в редакторе, таком как Emacs или nano . Если вы видите непечатные символы, то файл был сохранен с окончанием строки Windows.


3

Другая возможная причина - несколько экземпляров клиентов Git, запущенных одновременно . Например, «git shell» + «GitHub Desktop» и т. Д.


Это случилось со мной. Я использовал «GitHub Desktop» в качестве основного клиента, и он игнорировал некоторые новые настройки .gitignore: commit after commit:

  1. Вы что-то делаете.
  2. Далее, commit: игнорирует настройки .gitignore. Фиксация включает в себя множество временных файлов, упомянутых в .gitignore.
  3. Очистить кеш Git; проверьте, является ли .gitignore UTF-8; удалить файлы → зафиксировать → переместить файлы назад; пропустить один коммит - ничего не помогло.

Причина : редактор кода Visual Studio работал в фоновом режиме с тем же открытым хранилищем. Visual Studio Code имеет встроенный элемент управления Git, что создает некоторые конфликты.

Решение : перепроверьте несколько скрытых клиентов Git и одновременно используйте только один клиент Git, особенно при очистке кэша Git.


3

Уже есть несколько отличных ответов, но моя ситуация была утомительной. Я отредактировал исходный код установленного программного обеспечения PLM (управление жизненным циклом продукта) на Win10 и впоследствии решил: «Я, вероятно, должен был сделать это git-репо».

Таким образом, опция кэширования не будет работать для меня напрямую. Публикация сообщений для тех, кто мог добавить контроль исходного кода ПОСЛЕ выполнения первоначальной работы И .gitignoreне работает НО, возможно, вы боитесь потерять кучу работы, что git rm --cachedне для вас.

! ВАЖНО: Это действительно потому, что я слишком поздно добавил git в «проект», который слишком велик и, похоже, игнорирует мой .gitignore. У меня НЕТ коммитов, никогда. Я могу сойти с рук с этим :)

Сначала я только что сделал:

rm -rf .git
rm -rf .gitignore

Затем мне нужно было представить картину моих изменений. Опять же, это установочный продукт, в который я внес изменения. Слишком поздно для первого коммита чистой ветки master. Итак, мне нужен список того, что я изменил, так как я установил программу, добавив > changed.logк одному из следующих:

PowerShell

# Get files modified since date.
Get-ChildItem -Path path\to\installed\software\ -Recurse -File | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-02-25')} | Select-Object FullName

удар

# Get files modified in the last 10 days...
find ./ -type f -mtime -10

Теперь у меня есть список того, что я изменил за последние десять дней (давайте не будем здесь вдаваться в лучшие практики, кроме как сказать, да, я сделал это для себя).

Для начала, теперь:

git init .
# Create and edit .gitignore

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

Наконец, у меня есть список желаемых изменений! В моем случае это шаблон - некоторые темы работают вместе с несколькими xml-конфигурациями, специфичными для запуска системы dev с этим программным обеспечением, которую я хочу поместить в репозиторий, чтобы другие разработчики могли его получить и внести свой вклад ... Это будет наша основная ветка, так что совершать, толкать и, наконец, ФИЛИАЛ для новой работы!


2

Просто удалите папку или файл, который был зафиксирован ранее в Git, с помощью следующей команды. Тогда файл gitignore будет отражать правильные файлы.

    git rm -r -f "folder or files insides"

2

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

foo/bar # The bar file contains sensitive data so we don't want to make this public

Итак, если у вас есть такие комментарии, измените их следующим образом:

# The bar file contains sensitive data so we don't want to make this public
foo/bar

2

Также возможно, что вы отредактировали .gitignoreфайл с помощью sudoкоманды. Я столкнулся с той же проблемой, и при выполнении команд: git statusя все еще мог видеть файлы «должны быть проигнорированы».

После редактирования nano .gitignoreвместо sudo nano .gitignore, я мог видеть правильное отражение.


2

Я создал .gitignore с помощью echo "..." > .gitignorePowerShell в Windows, потому что он не позволяет мне создавать его в Windows Explorer.

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


2

У меня тоже есть такая же проблема на Ubuntu, я создал .gitignoreиз терминала, и у меня это работает

touch .gitignore


2

Мой не работал, потому что я буквально создал текстовый документ с именем .gitignore

Вместо этого создайте текстовый документ, откройте его в Notepad ++, затем сохраните как .gitignore

Убедитесь, что вы выбрали Все типы (*. *) Из выпадающего списка при сохранении.


Или в gitbash, просто используйте touch .gitignore


1

Если вы пользователь Notepad ++ , попробуйте сделать следующее:

Откройте файл .gitignore с помощью Notepad ++ и выполните:

Меню ПравкаПреобразование EOLФормат WindowsСохранить .

Попробуйте использовать git statusснова и посмотрите, работает ли он для вас.

Я разместил ответ на подобный вопрос здесь .


1

Для меня это была еще одна проблема. Мой файл .gitignore настроен на игнорирование всего, кроме того, что я говорю, чтобы не игнорировать. Вроде такой:

/*
!/content/

Теперь это, очевидно, означает, что я также говорю Git игнорировать сам файл .gitignore. Что не было проблемой, пока я не отслеживал файл .gitignore. Но в какой-то момент я зафиксировал сам файл .gitignore. Это привело к тому, что файл .gitignore был должным образом проигнорирован.

Поэтому добавление еще одной строки исправило это:

/*
!/content/
!.gitignore

1

Моя проблема заключалась в том, что я записывал файлы, чтобы игнорировать их в кавычках "", а не с косой чертой /.

Это не сработало и было проигнорировано git:

"db.sqlite3"
"tdd_venv/"

Это работало просто отлично:

/db.sqlite3
/tdd_venv/

Я также проверил свою кодировку файлов в Windows с помощью Notepad ++. Кодировка была установлена ​​в UTF-8.

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