Игнорировать файлы, которые уже были переданы в Git-репозиторий

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

21 ответ

Решение

Чтобы отследить отдельный файл, который уже был добавлен / инициализирован в вашем хранилище, то есть прекратить отслеживание файла, но не удалять его из вашей системы, используйте: 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 опции для update-index, если вам нужно это сохранить после git-reset ( через)


Обновление: так как люди спрашивают, вот удобный (и обновленный, так как прокомментированный ниже) псевдоним для просмотра, какие файлы в настоящее время "игнорируются" (--assume-unchanged) в вашей локальной рабочей области

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"

Чтобы отследить файл, который уже был добавлен / инициализирован в вашем хранилище, т.е. прекратить отслеживание файла, но не удалять его из вашей системы, используйте: git rm --cached filename

Да - .gitignore система игнорирует только файлы, которые в данный момент не контролируются версиями из git.

Т.е. если вы уже добавили файл с именем test.txt с помощью git-add, затем добавив test.txt в .gitignore будет по-прежнему вызывать изменения в test.txt быть отслеженным.

Вы должны были бы git rm test.txt сначала и передайте это изменение. Только тогда изменится на test.txt быть проигнорированным

Удалить пробелы в.gitignore

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

Я следовал за этими шагами

git rm -r --cached .
git add .
git reset HEAD

после этого, git удалите все файлы (*.swp в моем случае), которые следует игнорировать.

Комплексные ответы везде!

Просто используйте следующее

git rm -r --cached .

Он удалит файлы, которые вы пытаетесь игнорировать, из источника, а не из мастера на вашем компьютере!

После этого просто совершите и нажмите!

Если вы хотите остановить отслеживание файла без удаления файла из локальной системы, который я предпочитаю игнорировать 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

Спасибо

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

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

Если вы захотите начать отслеживать это снова:

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

Как говорит dav_i, чтобы сохранить файл в репо и при этом удалить его из изменений без создания дополнительного коммита, вы можете использовать:

git update-index --assume-unchanged filename

Ни один из ответов не сработал для меня.

Вместо:

  1. Переместите файл из каталога, управляемого Git
  2. Проверьте удаление в мерзавце
  3. Переместите файл обратно в каталог, контролируемый git

После перемещения файла назад, git проигнорирует его.

Работает с каталогами тоже!

Есть и другое предложение для медленных парней вроде меня =) Поместите файл .gitignore в корень вашего репозитория, а не в папку .git. Ура!

Не зная точно, что сделала команда "ответа", я запустил ее, к моему ужасу. Он рекурсивно удаляет каждый файл из вашего репозитория git.

Stackru на помощь... Как вернуть "git rm -r ."?

git reset HEAD

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

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

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

tmp/*   # ignore my tmp folder (this doesn't work)

это работает

# ignore my tmp folder
tmp/

Благодаря вашему ответу я смог написать эту небольшую строчку, чтобы улучшить ее. Я запустил его на своем.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, Это только для файлов, которые не были изменены.

Я обнаружил странную проблему с.gitignore. Все было на месте и казалось правильным. Единственная причина, по которой мой.gitignore был "проигнорирован", заключалась в том, что конец строки был в формате Mac (\r). Таким образом, после сохранения файла с правильным окончанием строки (в vi используется:set ff=unix) все работает как чудо!

Еще одна проблема, не упомянутая здесь, заключается в том, что если вы создали свой.gitignore в блокноте Windows, то, как я выяснил, он может выглядеть как бред на других платформах. Главное, чтобы убедиться, что кодировка установлена ​​в ANSI в блокноте (или создать файл в Linux, как я).

Из моего ответа здесь: /questions/48218820/gitignore-ne-rabotaet/48218902#48218902

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

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

Это остановит отслеживание игнорируемых файлов. Если вы действительно хотите удалить файлы из файловой системы, не используйте --cached вариант. Вы также можете указать папку для ограничения поиска, например:

git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm

Также нужно помнить одну вещь, если .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.", чего, конечно, у вас нет.

На моем сервере linux (не верно для моего локального dev mac) каталоги игнорируются, если я не добавляю звездочку:

WWW / архив /*

Я не знаю почему, но это заставило меня потерять пару часов, поэтому я хотел поделиться...

Другие вопросы по тегам