it-swarm.com.ru

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

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

2363
trobrock

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

3906
trobrock

Если вы пытаетесь игнорировать изменения в файле, который уже отслеживается в хранилище (например, файл 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:]]"
564
dyodji

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

355
pagetribe

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

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

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

79
Antony Stubbs

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

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

49
MikeJansen

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

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

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

40
Orlando

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

Спасибо

36
przbadu

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

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

git rm -r --cached .

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

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

30
Ahmad Awais

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

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

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

git update-index --no-assume-unchanged path/to/file                      
28
Mark Salvatore

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

git update-index --assume-unchanged filename
27
Iman Mohamadi

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

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

git reset HEAD

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

23
averydev

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

22
Olga

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

Вместо:

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

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

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

21
Hunter S

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

19
Aragorn

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

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

это работает

# ignore my tmp folder
tmp/
19
kindahero

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

12
umop

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

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

9
Matt Parkins

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

9
Johannes Vetter

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

wWW/архив/*

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

7
ndemoreau

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

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

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

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

6
Etherealone

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

6
Gabriel Perdue