Я проверил загрузку файлов в ветке и объединил их, а затем пришлось удалить их, и теперь у меня остался большой файл .pack, от которого я не знаю, как избавиться.
Я удалил все файлы с помощью git rm -rf xxxxxx
и также запустил эту --cached
опцию.
Может ли кто-нибудь сказать мне, как я могу удалить большой файл .pack, который в настоящее время находится в следующем каталоге:
.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack
Мне просто нужно удалить ветку, которая у меня еще есть, но больше не используется? Или мне нужно что-то еще запустить?
Я не уверен, насколько это важно, но он показывает замок напротив файла.
Спасибо
РЕДАКТИРОВАТЬ
Вот несколько отрывков из моей 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.
источник
Ответы:
Проблема в том, что даже если вы удалили файлы, они все еще присутствуют в предыдущих версиях. В этом весь смысл git: даже если вы что-то удалите, вы все равно можете вернуть это, обратившись к истории.
То, что вы хотите сделать, называется перезаписью истории, и в ней задействована
git filter-branch
команда.У GitHub есть хорошее объяснение проблемы на своем сайте. https://help.github.com/articles/remove-sensitive-data
Чтобы ответить на ваш вопрос более прямо, вам в основном нужно запустить эту команду с
unwanted_filename_or_folder
соответствующей заменой:Это удалит все ссылки на файлы из активной истории репо.
Следующий шаг, чтобы выполнить цикл GC, чтобы все ссылки на файл истекли и были удалены из файла упаковки. В этих командах ничего заменять не нужно.
источник
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
2)git reflog expire --expire=now --all
3)git gc --prune=now
bfg
гораздо проще пользоваться. Это также рекомендуется в официальных документах на github: help.github.com/articles/…Сценарий А. Если ваши большие файлы были добавлены только в ветку, запускать не нужно
git filter-branch
. Вам просто нужно удалить ветку и запустить сборку мусора:Сценарий B : Однако, судя по вашей истории bash, вы действительно слили изменения в master. Если вы никому не поделились изменениями (
git push
пока нет ). Проще всего было бы сбросить мастер обратно до слияния с веткой, в которой были большие файлы. Это устранит все коммиты из вашей ветки и все коммиты, сделанные для мастера после слияния. Таким образом, вы можете потерять изменения - в дополнение к большим файлам - которые вы действительно хотели:Затем выполните шаги из сценария A.
Сценарий C : если после слияния были другие изменения из ветки или изменения на главном сервере, которые вы хотите сохранить, было бы лучше перебазировать мастер и выборочно включить те коммиты, которые вы хотите:
В своем редакторе удалите строки, соответствующие коммитам, добавившим большие файлы, но оставьте все остальное как есть. Сохранить и выйти. Ваша основная ветка должна содержать только то, что вы хотите, и никаких больших файлов. Обратите внимание, что
git rebase
без-p
исключения коммиты слияния будут исключены, поэтому после этого у вас останется линейная история для мастера<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.
источник
Как уже было сказано в ответе loganfsmyth , вам нужно очистить историю git, потому что файлы продолжают существовать там даже после удаления их из репо. Официальные документы GitHub рекомендуют BFG, который я считаю более простым в использовании, чем
filter-branch
:Удаление файлов из истории
Загрузите BFG с их сайта. Убедитесь, что у вас установлена Java, затем создайте зеркальный клон и очистите историю. Обязательно замените
YOUR_FILE_NAME
имя файла, который хотите удалить:Удалить папку
То же, что и выше, но используйте
--delete-folders
Другие варианты
BFG также позволяет использовать еще более изящные варианты (см. Документацию ), например:
Удалите из истории все файлы размером более 100 МБ:
Важный!
При запуске BFG будьте осторожны, чтобы оба
YOUR_FILE_NAME
иYOUR_FOLDER_NAME
действительно были просто именами файлов / папок. Это не пути , поэтому что-то вродеfoo/bar.jpg
не сработает! Вместо этого все файлы / папки с указанным именем будут удалены из истории репо, независимо от того, какой путь или ветка они существовали.источник
bfg
инструмент к локальному репозиторию git, как должна выглядеть команда?Один вариант:
запускать
git gc
вручную, чтобы сжать несколько файлов пакетов в один или несколько файлов пакетов. Эта операция является постоянной (то есть файл большого пакета сохранит свое поведение при сжатии), поэтому может быть полезно периодически сжимать репозиторий с помощьюgit gc --aggressive
Другой вариант - сохранить где-нибудь код и .git, а затем удалить .git и снова начать использовать этот существующий код, создав новый репозиторий git (
git init
).источник
git gc
и получил всего пару файлов пакета, но большой по-прежнему один из них, и я просто хотел бы избавиться от него, чтобы мне было проще сделать резервную копию папки извне (раньше zip был 1 -2Мб, сейчас 55Мб). Если кто-то не может предложить что-то еще, я думаю, мне придется создать новый git. Я предполагаю, что это означает, что я потеряю доступ к веткам, которые у меня есть, и т. Д.?Выполните следующую команду, заменив
PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
ее путем к файлу, который вы хотите удалить, а не только его именем. Эти аргументы будут:Это принудительно удалит все ссылки на файлы из активной истории репо.
Следующий шаг, чтобы выполнить цикл GC, чтобы все ссылки на файл истекли и были удалены из файла пакета. В этих командах ничего заменять не нужно.
источник
Я немного опаздываю на шоу, но если приведенный выше ответ не помог решить вопрос, я нашел другой способ. Просто удалите конкретный большой файл из .pack. У меня была эта проблема, когда я случайно зарегистрировал большой файл размером 2 ГБ. Я выполнил шаги, описанные в этой ссылке: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/
источник
это больше удобное решение, чем кодирование. заархивируйте файл. Откройте zip-архив в формате просмотра файла (отличном от формата распаковки). Удалите файл .pack. Разархивируйте и замените папку. Работает как шарм!
источник