Удалить крупно.файл пакета, созданный 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 файл либо.

710   5  

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

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

    Ничего не найдено.