Удалить крупно.файл пакета, созданный git
Я проверил загрузку файлов в ветку и слил, а затем должен был удалить их, и теперь я остался с большим .упакуйте файл, от которого я не знаю, как избавиться.
Я удалил все файлы с помощью git rm -rf xxxxxx и я тоже побежал --cached опция, а также.
может кто-нибудь сказать мне, как я могу удалить большое .файл пакета, который в настоящее время находится в следующем каталоге:
.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack
мне просто нужно удалить ветку, которая у меня все еще есть, но нет более длительное использование? Или есть что-то еще, что мне нужно запустить?
Я не уверен, насколько это важно, но он показывает замок против файла.
спасибо
EDIT
вот некоторые выдержки из моей bash_history, которые должны дать представление о том, как мне удалось попасть в это состояние (предположим, что на данный момент я работаю над веткой git под названием "my-branch", и у меня есть папка, содержащая больше папок/файлов):
git add .
git commit -m "Adding my branch changes to master"
git checkout master
git merge my-branch
git rm -rf unwanted_folder/
rm -rf unwanted_folder/ (not sure why I ran this as well but I did)
Я думал, что я также запустил следующее, но оно не появляется в bash_history с другими :
git rm -rf --cached unwanted_folder/
Я также думал, что я запустил некоторые команды git (например,git gc), чтобы попытаться привести в порядок файл пакета, но они не появляются в .bash_history файл либо.
5 ответов:
проблема в том, что, хотя вы удалили файлы, они все еще присутствуют в предыдущих версиях. В этом весь смысл git, заключается в том, что даже если вы удалите что-то, вы все равно можете получить его обратно, получив доступ к истории.
то, что вы хотите сделать, называется переписыванием истории, и это связано с .
GitHub имеет хорошее объяснение проблемы на своем сайте. https://help.github.com/articles/remove-sensitive-data
чтобы ответить на ваш вопрос более прямо, вам в основном нужно запустить эту команду с
unwanted_folename_or_folderзаменить соответственно:git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_folename_or_folder' --prune-emptyЭто позволит удалить все ссылки на файлы из активной истории РЕПО.
далее, чтобы выполнить цикл GC, чтобы заставить все ссылки на файл истекать и удаляться из файла пакета. В них ничего не нужно заменять команды.
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin git reflog expire --expire=now --all git gc --aggressive --prune=now
один вариант:
выполнить
git gcвручную объединить несколько файлов в один или несколько файлов пакета. Эта операция является постоянной (т. е. большой файл пакета сохранит свое поведение сжатия), поэтому может быть полезно периодически сжимать репозиторий с помощьюgit gc --aggressiveдругой вариант-Сохранить код И.git где-то, а затем удалить .git и начните снова использовать этот существующий код, создавая новый репозиторий git (
git init).
Сценарий A: если ваши большие файлы были добавлены только в ветку, вам не нужно запускать
git filter-branch. Вам просто нужно удалить ветку и запустить сборку мусора:git branch -D mybranch git reflog expire --expire-unreachable=all --all git gc --prune=allСценарий B: тем не менее, похоже, что на основе вашей истории bash вы объединили изменения в master. Если вы не поделились изменениями с кем-либо (нет
git pushпока). Проще всего было бы сбросить master обратно до слияния с веткой, которая имела большой файл. Это устранит все коммиты из вашей ветви и все коммиты, сделанные для master после слияния. Таким образом, вы можете потерять изменения-в дополнение к большим файлам-которые вы, возможно, действительно хотели:git checkout master git log # Find the commit hash just before the merge git reset --hard <commit hash>затем выполните шаги из сценария A.
Сценарий C: если были другие изменения из ветки или изменения на master после слияния, которое вы хотите сохранить, было бы лучше перебазировать master и выборочно включить коммиты, которые вы хотите:
git checkout master git log # Find the commit hash just before the merge git rebase -i <commit hash>в Редакторе удалите строки, соответствующие коммитам, которые добавили большие файлы, но оставьте все остальное как есть. Сохранить и выйти. Ваша главная ветвь должна содержать только то, что вы хотите, и никаких больших файлов. Обратите внимание, что
git rebaseбез-pустранит коммиты слияния, так что вы останетесь с линейной историей для master после<commit hash>. Это, вероятно, хорошо для вас, но если нет, вы можете попробовать с-p, аgit help rebaseговоритcombining -p with the -i option explicitly is generally not a good idea unless you know what you are doing.затем выполните команды из сценария A.
как логанфсмит уже заявил в своем ответ, вам нужно очистить историю git, потому что файлы продолжают существовать там даже после удаления их из РЕПО. Официальные документы GitHub рекомендую BFG который я нахожу проще в использовании, чем
filter-branch:удаление файлов из истории
скачать BFG с их сайта. Убедитесь, что у вас установлена java, затем создайте зеркальный клон и очистите историю. Убедитесь в том, чтобы заменить
YOUR_FILE_NAMEС именем файла, который вы хотите удалить:git clone --mirror git://example.com/some-big-repo.git java -jar bfg.jar --delete-files YOUR_FILE_NAME some-big-repo.git cd some-big-repo.git git reflog expire --expire=now --all && git gc --prune=now --aggressive git push
удалить папку
то же, что и выше, но использовать
--delete-foldersjava -jar bfg.jar --delete-folders YOUR_FOLDER_NAME some-big-repo.git
другие функции
BFG также позволяет даже более причудливые варианты (см. docs), как это:
удалить все файлы размером более 100 м из истории:
java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
важно!
при запуске BFG, будьте осторожны, что оба
YOUR_FILE_NAMEиYOUR_FOLDER_NAMEдействительно просто имена файлов/папок. это не пути, что-то вродеfoo/bar.jpgне будет работать! Вместо этого все файлы/папки с указанным именем будут удалены из истории РЕПО, независимо от того, какой путь или ветвь они существовали.
Я немного опоздал на шоу, но в случае, если приведенный выше ответ не решил запрос, то я нашел другой способ. Просто удалите конкретный большой файл .упаковка. У меня была эта проблема, когда я случайно проверил большой файл 2GB. Я следовал инструкциям, описанным в этой ссылке: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/
Comments