У меня есть уже инициализированный репозиторий Git, в который я добавил файл .gitignore
. Как обновить индекс файла, чтобы файлы, которые я хочу игнорировать, игнорировались?
Чтобы отследить один файл, который уже был добавлен/инициализирован в ваш репозиторий, т.е. Остановить отслеживание файла, но не удалить его из вашей системы, используйте: git rm --cached filename
Чтобы разобрать все файлы, которые теперь находятся в вашем .gitignore
:
Сначала выполните любые незавершенные изменения кода, а затем запустите эту команду:
git rm -r --cached .
Это удаляет любые измененные файлы из индекса (промежуточной области), а затем запускает:
git add .
Зафиксируйте это:
git commit -m ".gitignore is now working"
Чтобы отменить git rm --cached filename
, используйте git add filename
.
Обязательно выполните все важные изменения перед запуском
git add.
В противном случае вы потеряете любые изменения в других файлах.
Если вы пытаетесь игнорировать изменения в файле, который уже отслеживается в репозитории (например, файл dev.properties, который вам нужно изменить для вашей локальной среды, но вы никогда не захотите проверять эти изменения), чем то, что вы хотите сделать это:
git update-index --assume-unchanged <file>
Если вы хотите снова начать отслеживание изменений
git update-index --no-assume-unchanged <file>
См. git -update-index (1) Страница руководства.
Также ознакомьтесь с параметрами skip-worktree
и no-skip-worktree
для индекса обновления, если вам нужно это, чтобы сохранить прошлое git - reset (через)
Обновление: Поскольку люди спрашивали, здесь удобный (и обновленный после прокомментированного ниже) псевдоним для того, чтобы увидеть, какие файлы в настоящее время "игнорируются" (- без изменений) в локальной рабочей области
$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"
git ls-files -v
Если напечатанный символ написан строчными буквами, файл помечается как предполагаемый без изменений. см .: stackoverflow.com/a/2363495/677381 и: git-scm.com/docs/git-ls-files
Чтобы отследить файл, который уже был добавлен/инициализирован в ваш репозиторий, то есть прекратите отслеживание файла, но не удалите его из вашей системы: git rm --cached filename
*.config
к вашему .gitignore
, вы можете выполнить git rm --cached *.config
чтобы остановить отслеживание всех файлов *.config
.
Да - .gitignore
система игнорирует файлы, которые в настоящее время не находятся под управлением версиями от git.
т.е. если вы уже добавили файл с именем test.txt
с помощью git-add
, то добавление test.txt
в .gitignore
все равно приведет к отслеживанию изменений test.txt
.
Сначала вам нужно git rm test.txt
и зафиксировать это изменение. Только тогда изменения в test.txt
будут проигнорированы.
<file>
был успешно проигнорирован. Я использую GIT версии 1.8.1 - Если это было проблемой.
Удалить пробельные пробелы в .gitignore
Кроме того, убедитесь, что в вашем .gitignore нет конечных пробелов. Я добрался до этого вопроса, потому что искал ответ, тогда мне было смешно, что я должен открыть редактор вместо того, чтобы просто косить .gitignore. Удалено лишнее пространство с конца, а poof работает сейчас:)
Если вы хотите остановить файл отслеживания, не удаляя файл из локальной системы, который я предпочитаю игнорировать config/database.yml
. Просто попробуйте:
git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.
добавьте этот файл в файл .gitignore
и зафиксируйте изменения. И с этого момента любые изменения, внесенные в config/database.yml, не будут отслеживаться с помощью git.
$ echo config/database.yml >> .gitignore
Спасибо
i выполнил следующие шаги
git rm -r --cached .
git add .
git reset HEAD
после этого git удалите все файлы (*.swp в моем случае), которые следует игнорировать.
Чтобы удалить только несколько определенных файлов:
git update-index --assume-unchanged path/to/file
Если вы хотите снова начать отслеживать его:
git update-index --no-assume-unchanged path/to/file
Комплексные ответы везде!
Просто используйте следующие
git rm -r --cached .
Он удалит файлы, которые вы пытаетесь игнорировать, из источника, а не из мастера на вашем компьютере!
После этого просто зафиксируйте и нажмите!
Как сообщает dav_i, чтобы сохранить файл в репо и все же удалить его из изменений без создания дополнительной фиксации, вы можете использовать:
git update-index --assume-unchanged filename
git update-index --no-assume-unchanged filename
Не зная, что сделала команда "ответ", я побежал, к большому разочарованию. Он рекурсивно удаляет каждый файл из вашего репозитория git.
Сохранение на резервную копию... Как вернуть "git rm -r." ?
git reset HEAD
Это трюк, поскольку у меня были незаблокированные локальные файлы, которые я не хотел перезаписывать.
git rm -r --cached .
не работает для меня Git все еще утверждал, что мой файл проекта textmate не отслеживался, хотя .tmproj находится в моем глобальном файле игнорирования. Сброс моего локального repro, как это сработало, хотя. На самом деле я добавил опцию 'hard', как в git reset --hard HEAD
. Это должно иметь почти такой же эффект в этом случае.
--hard
. Любые незафиксированные изменения будут выброшены без предупреждения!
Есть другое предложение, возможно, для медленных парней вроде меня =) Поместите файл .gitignore в корень репозитория не в .git > . Ура!
Ни один из ответов не работал у меня.
Вместо
После перемещения файла, git проигнорирует его.
Работает с каталогами!
Другая проблема, с которой я столкнулся, заключалась в том, что я разместил встроенный комментарий.
tmp/* # ignore my tmp folder (this doesn't work)
это работает
# ignore my tmp folder
tmp/
Если файлы уже находятся в управлении версиями, вам необходимо удалить их вручную.
git rm --cached
и git reset HEAD
оба инструмента, с git rm --cached
я довольно хорошо знаком, и мог получить его из репозитория. Успех пришел сначала из rm --cached
, затем фактически удалил его вручную, rm --cached
, а затем rm --cached
его вручную. И все.
rm foo/bar && git add -u && git commit -m "removed foo/bar" && git push
. Затем, нажав touch foo/bar && git status
увидите, что файл теперь правильно игнорируется.
Благодаря вашему ответу, я смог написать этот маленький однострочный вкладыш, чтобы улучшить его. Я запустил его на своем .gitignore и репо, и у меня не было проблем, но если кто-нибудь увидит какие-либо вопиющие проблемы, прокомментируйте. Это должно git rm -r --cached
от .gitignore
:
cat $(git rev-parse --show-toplevel)/ .gitIgnore | sed "s//$//" | grep -v "^ #" | xargs -L 1 -I {} найти $(git rev-parse --show-toplevel) -name "{}" | xargs -L 1 git rm -r --cached
Обратите внимание, что вы получите много fatal: pathspec '<pathspec>' did not match any files
. Это просто для файлов, которые не были изменены.
s//$//
должен быть s/$//
? Кроме того, какой смысл в командах sed и grep? Я предполагаю, что это фильтрация комментариев из gitignore?
Я нашел странную проблему с .gitignore. Все было на месте и казалось правильным. Единственная причина, по которой мой .gitignore был "проигнорирован", заключалась в том, что окончание строки было в Mac-Format (\ r). Поэтому после сохранения файла с правильным концом строки (в vi с использованием: set ff = unix) все работало как шарм!
.gitignore
означает, что каждая строка является либо комментарием (начинающимся с .gitignore
#
), либо вся строка (включая любые пробелы) является шаблоном полного имени файла. Если вы добавили \r
в строку, git
будет игнорировать только те файлы, которые заканчиваются на \r
(вы можете создать их, если хотите!). Смотрите man gitignore
для деталей, это стоит прочитать.
Еще одна проблема, не упомянутая здесь, заключается в том, что вы создали свой .gitignore в блокноте Windows, который, как я узнал, может выглядеть как тарабарщина на других платформах. Ключ должен убедиться, что кодировка установлена в ANSI в блокноте (или создайте файл на linux, как и я).
Из моего ответа здесь: https://stackoverflow.com/questions/11451535/gitignore-is-ignored-by-git
На моем сервере linux server (неправда на моем локальном мастере dev) каталоги игнорируются, пока я не добавляю звездочку:
WWW/архив/*
Я не знаю, почему, но это заставило меня потерять пару часов, поэтому я хотел поделиться...
Следует иметь в виду, что если .gitignore
, похоже, не игнорирует файлы без следа, так это то, что у вас не должно быть комментариев в той же строке, что и игнорировать. Так что это нормально
# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*
Но это не сработает:
foo* # ignore all foo.txt, foo.markdown, foo.dat, etc.
.gitignore
интерпретирует последний случай как "игнорировать файлы с именем "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc."
, которые, конечно, у вас нет.
Если вам нужно прекратить отслеживать много игнорируемых файлов, вы можете комбинировать некоторые команды:
git ls-files -i --exclude-standard | xargs -L1 git rm --cached
Это остановит отслеживание игнорируемых файлов. Если вы хотите удалить файлы из файловой системы, не используйте параметр --cached
. Вы также можете указать папку для ограничения поиска, например:
git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm
git rm -r --cached .
удаляет много других вещей!