Как удалить файлы, перечисленные в .gitignore, но все же в репозитории?

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

Итак, мой вопрос: есть ли волшебная команда или script с использованием ветки фильтра, которая может переписать мою историю и легко удалить все эти файлы? Или просто команда, которая создаст коммит, который их удалит?

Ответ 1

Вы можете удалить их из репозитория вручную:

git rm --cached file1 file2 dir/file3

Или, если у вас много файлов:

git rm --cached `git ls-files -i --exclude-from=.gitignore`

Но это не работает в Git Bash в Windows. Он выдает сообщение об ошибке. Следующее работает лучше:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

Что касается перезаписи всей истории без этих файлов, я очень сомневаюсь, что там есть автоматический способ сделать это. И мы все знаем, что переписать историю плохо, не так ли?:)

Ответ 2

Более простой способ работы с любой ОС - сделать

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

В основном вы читаете все файлы, кроме тех, что содержатся в .gitignore

Ответ 3

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

Используйте git clean -xdn для выполнения сухого хода и посмотрите, что будет удалено.
Затем используйте git clean -xdf для его выполнения.

В принципе, git clean -h или man git-clean (в unix) предоставит вам помощь.

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

Надеюсь, что это поможет.

Ответ 4

Я сделал очень простое решение, манипулируя выводами инструкции .gitignore с помощью sed:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

Пояснение:

  • распечатать файл .gitignore
  • удалить все комментарии из печати
  • удалить все пустые строки
  • добавить 'git rm -r' в начало строки
  • выполнить каждую строку.

Ответ 5

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

Но файлы, уже существовавшие в репозитории, все еще будут находиться.

используйте git rm files_ignored; git commit -m 'rm no use files' для удаления игнорируемых файлов.