Полностью удалить файлы из репозитория Git и удаленного на GitHub - PullRequest
76 голосов
/ 06 апреля 2011

Я случайно добавил папку с изображениями и зафиксировал.Затем я сделал еще один коммит.Затем я удалил эти файлы, используя git rm -f ./images, и зафиксировал снова.

Прямо сейчас я сделал намного больше коммитов в этой ветке (мастер).В моей голове у меня нет этой папки ./static/images.

Из-за этого размер моего репо сильно увеличился.Как я могу полностью удалить эти капли?И я хочу удалить его из моего удаленного репозитория GitHub.

Ответы [ 3 ]

124 голосов
/ 06 апреля 2011

Это то, что вы ищете: игнорирование не удаляет файл . Я предлагаю вам прочитать эту страницу, но вот конкретная команда для использования:

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

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

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

git rebase -i master

Вам будет представлен список коммитов.Удалите строки с мошенническими коммитами, которые вы хотите удалить.("dd" удаляет строку в vim, редакторе по умолчанию. Затем сохраните с помощью ZZ)

Оборванные коммиты будут затем очищены в процессе естественного сбора мусора git, процесс, который вы можете запустить с помощью командыдано в ответе Дархуука.

Редактировать: Это будет работать, даже если вы перешли в удаленный репозиторий, но вам придется нажать --force.(То же самое относится к решению git filter-branch).

Обратите внимание, что это будет очень раздражать любого, кто вытащил из вашей ветки.Они должны проконсультироваться с «восстановление после исходной перезагрузки» .


Предположительно, ваше первоначальное случайное добавление изображений является частью коммита, который вы хотите сохранить.В этом случае вам нужно отредактировать коммит во время перебазирования, чтобы разделить части, которые вы хотите сохранить.Вы можете сделать это, заменив «pick» в списке «rebase -i» для этого коммита на «e» (для редактирования).Здесь процесс перебазирования остановится, и вы можете разделить коммит с помощью "git commit --amend".

3 голосов
/ 03 октября 2014

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

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

Одна строка:

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
...