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

этот вопрос уже есть ответ здесь:

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

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

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 (via)


обновление: Поскольку люди спрашивали, Вот удобный (и обновленный с комментариями ниже) псевдоним для просмотра, какие файлы в настоящее время "игнорируются" (--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 to .gitignore все равно вызовет изменения test.txt чтобы быть отслежены.

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


удалить конечные пробелы .gitignore

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


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

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

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


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

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

теперь, добавьте этот файл в .gitignore file и зафиксировать изменения. И отныне любые изменения, внесенные в 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

сложные ответы везде!

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

git rm -r --cached .

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

после этого просто commit и push!


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

git reset HEAD

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


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


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

вместо:

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

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

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


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

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

это работает

# ignore my tmp folder
tmp/

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


благодаря вашему ответу, я смог написать эту небольшую команду, чтобы улучшить его. Я проверил его на своем .gitignore и repo, и не было никаких проблем, но если кто-то видит какие-либо вопиющие проблемы, прокомментируйте. Это должно git rm -r --cached с .gitignore:

cat $(git rev-parse --show-toplevel)/.гитюдного | СЭД "ы//$//" | команда grep -v с "^#" | команды xargs -Л 1 -я {} найти $(ЖКТ Рэв-синтаксический анализ --шоу-уровня) -название "{}" | команды xargs -Л 1 ГИТ РМ -Р --кэшированные

обратите внимание, что вы получите много fatal: pathspec '<pathspec>' did not match any files. Это только для файлов, которые не изменялись.


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


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

из моего ответа здесь: https://stackoverflow.com/a/11451916/406592


на моем сервере linux server (не true на моем локальном компьютере Mac) каталоги игнорируются, пока я не добавляю звездочку:

www / archives/*

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


одно дело иметь в виду, если .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

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

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