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


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

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

21 2233

21 ответ:

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


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

$ 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

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

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

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

git reset HEAD

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

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

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

вместо:

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

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

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

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

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

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

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

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

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

на моем сервере linux server (не верно на моем локальном dev 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