Полностью удалите файлы из Git repo и remote на GitHub
Я случайно добавил папку с изображениями и зафиксировал ее. Затем я сделал еще одну фиксацию.
Затем я удалил эти файлы с помощью git rm -f ./images
и снова зафиксировал их.
Прямо сейчас, я сделал намного больше коммитов в этой ветке (мастер). В моей HEAD у меня нет этой папки ./static/images
.
В связи с этим размер моего репо увеличился. Как я могу полностью удалить эти капли? И я хочу удалить его из моего удаленного репозитория GitHub.
Ответы
Ответ 1
Это то, что вы ищете: игнорирование не удаляет файл. Я предлагаю вам прочитать эту страницу, но здесь используется определенная команда:
git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD
Кроме того, чтобы удалить все удаленные файлы из кешей git, используйте:
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune
Вы можете найти дополнительную информацию о последней команде, а также script, которая делает все, что вы хотите, в одном действии, здесь: git: навсегда удалить файлы или папки из истории.
Другие ссылки с большим количеством объяснений: Удалить конфиденциальные данные.
[Изменить] Также см. этот вопрос в StackOverflow: Удалить конфиденциальные файлы и их коммиты из истории git.
(Команды, скопированные из natacado
отвечают в связанном выше вопросе.) Если вы уже удалили файлы из рабочей копии, должно работать следующее. Узнайте хэш для фиксации, которая добавила нежелательные файлы. Затем выполните:
git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
Ответ 2
Вы можете просто перегрузить всю ветку и удалить как фиксацию, добавившую изображения, так и фиксацию, которая их удалила.
git rebase -i master
Вам будет представлен список коммитов. Удалите строки, у которых есть ошибка, которую вы хотите удалить. ( "dd" удаляет строку в vim, редактор по умолчанию, а затем сохраняет с ZZ)
Затем оборванные коммиты будут очищены в ходе естественной сборки мусора git, процесс, который вы можете заставить с помощью команды, указанной в ответе Дархука.
Изменить: это будет работать, даже если вы нажали на удаленный репозиторий, но вам придется нажать с помощью --force. (То же самое относится к решению git filter-branch).
Обратите внимание, что это будет очень раздражать любого, кто вытащил из вашего ветки. Они должны проконсультироваться "восстановление из восходящей перестройки" .
Предположительно, ваше первоначальное случайное добавление изображений является частью фиксации, которую вы хотите сохранить. В этом случае вам нужно отредактировать фиксацию во время rebase, чтобы разделить части, которые вы хотите сохранить. Вы можете сделать это, заменив "pick" в списке "rebase -i" для этой фиксации с помощью "e" (для редактирования). Процесс переустановки остановится здесь, и вы можете разделить фиксацию с помощью "git commit -amend".
Ответ 3
Я по существу повторяю ответ в сочетании с этим предупреждением о форматировании Windows, только так, t теряется как комментарий.
Обратите внимание на использование двойных кавычек, а не одиночных кавычек, потому что это зависит от того, что вы используете, как строки разбираются.
Одиночная линия:
git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD
Несколько строк:
git filter-branch --index-filter \
"git rm -r --cached --ignore-unmatch <file/dir>" HEAD