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


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

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

5 187

5 ответов:

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

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  

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

более простой способ, который работает на любой ОС сделать

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

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

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

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

по сути, git clean -h или man git-clean(в unix) даст вам помощь.

имейте в виду, что эта команда также удалит новые файлы что не в плацдарм.

надеюсь, что это помогает.

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

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

объяснение:

  1. печатать .gitignore file
  2. удалить все комментарии из печати
  3. удалить все пустые строки
  4. добавить 'git rm-r' в начало строки
  5. выполнить каждую строчку.

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

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

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