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

2224

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

Теги:
caching
gitignore
version-control
git-rm

21 ответ

3875
Лучший ответ

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

  • 251
    будьте внимательны, чтобы зафиксировать все ваши изменения раньше, иначе вы потеряете контроль над всеми измененными файлами
  • 2
    Это, кажется, не остается на толчке или чистом клоне. есть идеи?
Показать ещё 34 комментария
501

Если вы пытаетесь игнорировать изменения в файле, который уже отслеживается в репозитории (например, файл 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:]]"
  • 10
    Это гений! Блестяще полезно. Знаете ли вы, есть ли способ получить список всех файлов «в ожидании»?
  • 12
    Это сработает для вас: git ls-files -v Если напечатанный символ написан строчными буквами, файл помечается как предполагаемый без изменений. см .: stackoverflow.com/a/2363495/677381 и: git-scm.com/docs/git-ls-files
Показать ещё 12 комментариев
351

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

  • 8
    Это был идеальный способ удалить пару файлов, которые я добавил, добавил, но позже понял, что отслеживать не нужно. После добавления этих файлов в .gitignore я смог сделать это и отлично отследить их.
  • 9
    Совет: например, если вы добавляете *.config к вашему .gitignore , вы можете выполнить git rm --cached *.config чтобы остановить отслеживание всех файлов *.config .
Показать ещё 3 комментария
78

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

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

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

  • 10
    Это не совсем так, можно игнорировать изменения в отслеживаемом файле ... см. Мой ответ: stackoverflow.com/a/11366713/677381
  • 0
    git update-index --assume-unchanged <file> и git rm --caheced <file> фактически не работали для меня. Я сделал git rm <file>, а затем создал новый файл после того, как этот <file> был успешно проигнорирован. Я использую GIT версии 1.8.1 - Если это было проблемой.
Показать ещё 1 комментарий
48

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

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

  • 4
    У меня была точно такая же проблема: P. Я тоже попал на этот вопрос из-за этого. Хорошо, что у вас есть это задокументировано здесь. +1
  • 3
    Если вы похожи на меня, вы используете vi для быстрого редактирования .gitignore, используйте ': set list', чтобы показать пробелы.
Показать ещё 2 комментария
38

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

Спасибо

38

i выполнил следующие шаги

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

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

  • 1
    будьте осторожны с этим, так как предполагается, что вы хотите добавить все файлы, кроме игнорируемых, и обычно это не так
28

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

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

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

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

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

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

git rm -r --cached .

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

После этого просто зафиксируйте и нажмите!

25

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

git update-index --assume-unchanged filename
  • 4
    Отменить: git update-index --no-assume-unchanged filename
  • 1
    Что делать, если вы хотите сделать это для всех файлов в папке за один раз?
23

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

Сохранение на резервную копию... Как вернуть "git rm -r." ?

git reset HEAD

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

  • 3
    git rm -r --cached . не работает для меня Git все еще утверждал, что мой файл проекта textmate не отслеживался, хотя .tmproj находится в моем глобальном файле игнорирования. Сброс моего локального repro, как это сработало, хотя. На самом деле я добавил опцию 'hard', как в git reset --hard HEAD . Это должно иметь почти такой же эффект в этом случае.
  • 3
    Будьте осторожны с флагом --hard . Любые незафиксированные изменения будут выброшены без предупреждения!
22

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

21

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

Вместо

  • Извлеките файл из git -контролируемого каталога
  • Проверьте удаление в git
  • Переместить файл обратно в каталог git -controlled

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

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

  • 1
    кажется, это единственное вменяемое решение :)
21

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

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

это работает

# ignore my tmp folder
tmp/
18

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

  • 2
    Я попробовал git rm --cached и git reset HEAD оба инструмента, с git rm --cached я довольно хорошо знаком, и мог получить его из репозитория. Успех пришел сначала из rm --cached , затем фактически удалил его вручную, rm --cached , а затем rm --cached его вручную. И все.
  • 2
    Это сработало для меня так: rm foo/bar && git add -u && git commit -m "removed foo/bar" && git push . Затем, нажав touch foo/bar && git status увидите, что файл теперь правильно игнорируется.
13

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

  • 0
    Sed s//$// должен быть s/$// ? Кроме того, какой смысл в командах sed и grep? Я предполагаю, что это фильтрация комментариев из gitignore?
10

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

  • 1
    Если у кого-то возникли проблемы с .gitignore после создания файла в блокноте Windows, здесь есть дополнительная информация: stackoverflow.com/questions/11451535/gitignore-not-working/…
  • 0
    Формат .gitignore означает, что каждая строка является либо комментарием (начинающимся с .gitignore # ), либо вся строка (включая любые пробелы) является шаблоном полного имени файла. Если вы добавили \r в строку, git будет игнорировать только те файлы, которые заканчиваются на \r (вы можете создать их, если хотите!). Смотрите man gitignore для деталей, это стоит прочитать.
9

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

Из моего ответа здесь: https://stackoverflow.com/questions/11451535/gitignore-is-ignored-by-git

8

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

WWW/архив/*

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

6

Следует иметь в виду, что если .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.", которые, конечно, у вас нет.

4

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

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

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

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

  • 0
    Это должен быть принятый ответ. git rm -r --cached . удаляет много других вещей!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню