git добавить добавление игнорируемых файлов

Я пытаюсь удалить ранее отслеживаемый каталог из git, который работает, но он добавляется обратно с каждым последующим git add ., git add -A, etc. Вот что я сделал:--9-->

добавить .gitignore в корне проекта:

node_modules

выполнить следующее:

git rm -r --cached node_modules
git commit -a -m "removed node_modules"
git push origin master

пока все хорошо, это удаляет каталог из удаленного репозитория. Проблема в том, когда я позже запускаю git status Он говорит мне, что каталог node_modules не отслеживается и продолжает добавлять его обратно о будущих обязательствах.

что мне не хватает и / или как найти корень моей проблемы?

С здесь:

команда git add не будет добавлять игнорируемые файлы по умолчанию. ... Команда git add может использоваться для добавления игнорируемых файлов с параметром-f (force).

дополнительная информация из комментариев:

я отслеживаю .файла.gitignore

git check-ignore node_modules/ возвращает папки node_modules/ как и ожидалось.

нет использования подмодулей.

обновление:

Я создал образец, который, как представляется, реплицирует проблему, следуя инструкциям выше:

https://github.com/awhitehouse104/SampleRepo

:

чтобы суммировать ответ и комментарии снизу, проблема заключалась в кодировке my .файла.gitignore Я использовал echo 'node_modules' > .gitignore создать файл в windows 8, и он вышел как UTF-16 С BOM (согласно ответу ниже). После нескольких поисков google кажется, что это кодировка по умолчанию с powershell, и я могу подтвердить, что сохранение как UTF-8, похоже, решило проблему.

tldr; вероятно, не используйте этот метод создания .gitignore файлы или будьте готовы изменить кодировку

echo 'node_modules' > .gitignore

10 ответов


у вас, вероятно, есть отрицательное правило (включить-снова правило, то, которое начинается с !) в где-то после node_modules линии.

git check-ignore имеет ошибку / неоднозначность в документах. Вы ожидаете, что если git check-ignore node_modules/ печать node_modules/, потом node_modules/ игнорируется. Но на самом деле он печатает путь, если этот путь соответствует любому шаблону игнорирования - положительному или отрицательному. Единственный способ быть уверенным-использовать -v (--verbose) вариант, который сделает git check-ignore печатать совпадающий рисунок.
Более того, если git check-ignore -v говорит каталог игнорируется, это не обязательно означает, что все файлы в этом каталоге игнорируются. Пример РЕПО:

/
    .git/
    .gitignore
    node_modules/
        bar
        foo
$ cat .gitignore 
/node_modules/*
!/node_modules/foo

$ git check-ignore -v node_modules/
.gitignore:1:/node_modules/*    node_modules/
             ^ positive pattern => ignored

$ git check-ignore -v node_modules/foo
.gitignore:2:!/node_modules/foo node_modules/foo
             ^ negative pattern => not ignored

$ git add -A

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   node_modules/foo
#

если git check-ignore -v node_modules/ говорит node_modules/ игнорируется, do git add -A node_modules/ и затем запустить git check-ignore -v --no-index против отдельных файлов, которые были добавлены, чтобы узнать, почему они были добавлены.


обновление: я не ожидал, что: ваш .gitignore файл находится в " UTF-16 С BOM (Знак порядка байтов)" кодировка:

$ cat .gitignore | hexdump -vC
00000000  ff fe 6e 00 6f 00 64 00  65 00 5f 00 6d 00 6f 00  |..n.o.d.e._.m.o.|
00000010  64 00 75 00 6c 00 65 00  73 00 0d 00 0a 00        |d.u.l.e.s.....|

вот почему git, вероятно, не может справиться с этим. Сохраните файл в UTF-8 без BOM, что должно решить проблему. Но я также предлагаю подать отчет об ошибке против git check-ignore - в этом угловом случае его выход явно не соответствует тому, что Git фактически игнорирует.


добавьте файл в Git ignore, затем

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

можно сделать

git check-ignore -v --no-index path/with/unexpected/result

чтобы понять, почему git add добавил Или не добавил этот путь.

git check-ignore docs.

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

далее делать find . -name .git. Подмодули являются вложенными репозиториями,.gitmodules и команда субмодуль удобны, но они просто там, чтобы помочь с ними.


вот что я делаю, чтобы игнорировать папки node_modules папка после того, как я ее отследил.

  1. создать .gitignore файл и добавить папки node_modules к нему.

  2. совершение .gitignore. После этого момента все, что вы обновите в папки node_modules папка не будет отображаться в git status.

  3. но это не удаляет то, что у нас уже есть на репо под the папки node_modules. Так что теперь нам нужно убрать все, что мы уже совершили.

    для этого используйте git rm --cached node_modules -r

  4. теперь git status покажет, что файлы будут удалены.

  5. использовать git commit -m "node_modules removed" команда с любым сообщением.

теперь все должно быть удален из РЕПО и будущие изменения не будут отслеживаться.


другой подход, если вы не хотите использовать git rm --cached

rm -Rf node_modules
git add -u
git commit -m "stop tracking node_modules"

npm install
# done

также обратите внимание на различие между node_modules и node_modules/, которое вы, похоже, имеете правильно. (Спасибо umläute за примечание об этом)


Я создал репозиторий, чтобы попытаться дублировать вашу проблему, и я получил первый ответ от http://www.stackoverflow.com/questions/11451535/gitignore-not-working работать.

вот мое РЕПО, если вам интересно:https://github.com/IAMZERG/so_project_gitignore

попробуйте добавить это .вместо пример:

**/directory_to_remove

после этого запустите git rm --cached directory_to_remove -Р

git status должен показать, что вы удалили кучу файлов в каталоге, который вы пытаетесь удалить. Затем commit и push в свой пульт, и все должно быть золотым... Может быть?


У меня была аналогичная проблема. Убедившись, что моя кодировка была ANSI, а окончания строк были Unix (LF) исправлена моя проблема.


gitignore - указывает намеренно не отслеживаемые файлы для игнорирования.

$ HOME/.конфиг/ГИТ/игнорировать, $использование переменной git_dir/инфо/исключить .gitignore

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

игнорировать всю каталог, который вы должны использовать /**,

трейлинг / * * соответствует всему внутри. Например, abc / ** соответствует всем файлам внутри каталога "abc", относительно расположения.файл gitignore, с бесконечной глубиной.

или

Вы можете игнорировать весь каталог, добавив эту строку в корень .файл пример:

/имя_каталога

вместо этого вы можете добавить /logs/.файл gitignore, содержащий это:

[^.]*

каталог останется в вашем РЕПО, но все файлы внутри /каталога будут проигнорированы. Полегче!

шаги, которые вы должны следовать,

  1. удалите его из каталога проекта (фактически не удаляя его):

    git rm --кэшированная папка/*

  2. если у вас еще нет .гитюдного, вы можете сделать один прямо внутри вашей папки проекта:
  3. /проекта.гитюдного. Поместите папку / * (или любой шаблон, который вы считаете лучшим из приведенного выше списка) в .gitignore Commit:
  4. git commit-m "сообщение".
  5. нажмите сдачу на github.

пример, чтобы исключить все, кроме определенного каталога foo / bar (обратите внимание на / * - без косой черты, подстановочный знак также исключит все в foo/bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

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

  1. добавить различные файлы на свой .gitignore

  2. переместить эти файлы из вашего проекта git

  3. Rescan & StageChanged, эти операции скажут вам, что эти файлы были удалены

  4. Commit

  5. переместить назад файлы к вашему проекту, они больше не будут отслеживаться !


начало должно быть голым. Вот немного bash, чтобы продемонстрировать это. Не стесняйтесь редактировать его, если он не представляет ваш вариант использования.

#!/bin/bash

rm -rf /tmp/git_test
mkdir /tmp/git_test/
git init --bare /tmp/git_test/primary_repo

# populate repo
cd /tmp/git_test/
git clone ./primary_repo ./secondary_repo
cd secondary_repo
echo hi_bob > some_content
mkdir node_modules
echo hi_dave > node_modules/moduleA
git add .
git commit -m "populated primary"
git push

# do the removal in tertiary 
cd /tmp/git_test/
git clone ./primary_repo ./tertiary_repo
cd tertiary_repo
echo node_modules >> .gitignore
git add .gitignore
git rm -r --cached node_modules
git commit -a -m "removed node_modules"
git push origin master
rm -r node_modules
echo --------------------------------
echo git status:
git status