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 check-ignore -v --no-index path/with/unexpected/result
чтобы понять, почему git add
добавил Или не добавил этот путь.
в частности, дело в том, что вы хотите проверить, что на самом деле добавляется, а не каталог.
далее делать find . -name .git
. Подмодули являются вложенными репозиториями,.gitmodules
и команда субмодуль удобны, но они просто там, чтобы помочь с ними.
вот что я делаю, чтобы игнорировать папки node_modules папка после того, как я ее отследил.
создать .gitignore файл и добавить папки node_modules к нему.
совершение .gitignore. После этого момента все, что вы обновите в папки node_modules папка не будет отображаться в
git status
.-
но это не удаляет то, что у нас уже есть на репо под the папки node_modules. Так что теперь нам нужно убрать все, что мы уже совершили.
для этого используйте
git rm --cached node_modules -r
теперь
git status
покажет, что файлы будут удалены.использовать
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, содержащий это:
[^.]*
каталог останется в вашем РЕПО, но все файлы внутри /каталога будут проигнорированы. Полегче!
шаги, которые вы должны следовать,
-
удалите его из каталога проекта (фактически не удаляя его):
git rm --кэшированная папка/*
- если у вас еще нет .гитюдного, вы можете сделать один прямо внутри вашей папки проекта:
- /проекта.гитюдного. Поместите папку / * (или любой шаблон, который вы считаете лучшим из приведенного выше списка) в .gitignore Commit:
- git commit-m "сообщение".
- нажмите сдачу на github.
пример, чтобы исключить все, кроме определенного каталога foo / bar (обратите внимание на / * - без косой черты, подстановочный знак также исключит все в foo/bar):
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
Я нашел способ добавить файлы .гитюдного даже если они уже совершены. Это немного жестоко, но работает отлично.
добавить различные файлы на свой .gitignore
переместить эти файлы из вашего проекта git
Rescan & StageChanged, эти операции скажут вам, что эти файлы были удалены
Commit
переместить назад файлы к вашему проекту, они больше не будут отслеживаться !
начало должно быть голым. Вот немного 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