Как я могу полностью удалить данные из репозитория git? - PullRequest
2 голосов
/ 25 марта 2012

в моем проекте я по ошибке добавил несколько больших файлов изображений в репо. я читал о GitHub как удалить файлы из истории, и это сработало: вы больше не можете видеть файлы в истории. НО тогда я сделал tar.gz из моего проекта для резервного копирования, и теперь он в два раза размер, который у него был раньше! я не добавил ничего другого, что могло бы оправдать это увеличение, поэтому я подозреваю, что данные репо, которые использовались для представления файлов изображений, действительно не выбрасывались из репо. кто-нибудь может это подтвердить? есть ли исправление?

edit чтобы уточнить, я довольно мало знаю о git, поэтому я предпринял шаги, указанные на страницах справки GitHub , с единственным исключением, что мне пришлось использовать force перейти от второго файла и далее, как в git filter-branch -f --index-filter ....

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

  • создание пустого репо в другом месте
  • Воспроизведение файловой ситуации на разных этапах моего проекта, исключая ненужные
  • и, наконец, используйте этот новый репо вместо старого, чтобы отправлять материалы в GitHub.

это было сделано раньше? в частности, могу ли я использовать этот новый git-репо вместо старого с тем же проектом на GitHub?

кстати, это примерно 1028 * презентация я пишу прямо сейчас; есть изображение вавилонской башни, существовавшей в нескольких версиях в высоком разрешении, что объясняет размер проблемы (~ 100 МБ нежелательных данных).

редактировать 2 спасибо за предложения; я сделал

rm -rf .git/refs/original/
git reflog expire expire=now --all
git reflog expire --all
git gc --aggressive --prune=now

с тем эффектом, что размер *.tar.gz уменьшился всего на 0,5% ...

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

rm very-big-file.xcf
git filter-branch --index-filter 'git rm --cached --ignore-unmatch very-big-file.xcf' --prune-empty -- --all
rm -rf .git/refs/original/
git reflog expire --all
git gc --aggressive --prune=now

это записанные *.tar.gz размеры:

foo.tar.gz          7,518 
foo2.tar.gz    65,735,003 
foo3.tar.gz    32,777,155 

размер большого файла, сжатого , составляет 32 955 246 байт, что делает вполне вероятным, что он все еще полностью присутствует в .git, возможно, даже в несжатом виде.

GIT Y U SO STUBBORN ??

нет ли расширения git purge для этого? я имею в виду, git filter-branch --index-filter 'git rm --cached --ignore-unmatch very-big-file.xcf' --prune-empty -- --all - это не совсем то, что я мог набрать из памяти, когда у меня небольшое похмелье.

Ответы [ 2 ]

0 голосов
/ 25 марта 2012

Re "edit 3" ... вот полная последовательность, которую я на самом деле вошел и попытался устранить опечатки на этот раз. :-) Обратите внимание, что вы не можете filter-branch после удаления большого файла, если вы не зафиксировали это удаление (что для этого примера бессмысленно). Проверьте вывод du -s.

$ git init bigoop
Initialized empty Git repository in /tmp/bigoop/.git/
$ cd bigoop
$ echo tiny file with not much in it > tiny
$ git add tiny
$ git commit -m 'initial commit'
[master (root-commit) bd07e5a] initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 tiny
$ cp /path/to/huge/file hugefile
$ git add hugefile
$ git commit -m 'oops, add huge file'
[master 25cd764] oops, add giant file
 1 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hugefile
$ du -s .git
618992  .git
$ rm hugefile
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch hugefile' --prune-empty -- --all
Cannot rewrite branch(es) with a dirty working directory.
$ git checkout hugefile
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch hugefile' --prune-empty -- --all
Rewrite 25cd7647f49173fa8f42c0ca0a2ab8baf1842fca (2/2)rm 'hugefile'

Ref 'refs/heads/master' was rewritten
$ du -s .git
619012  .git
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
Counting objects: 3, done.
Writing objects: 100% (3/3), done.
Total 3 (delta 0), reused 0 (delta 0)
$ du -s .git
140     .git

Что касается "GIT Y U SO STUBBORN ??" ... это действительно работает, чтобы не потерять вещи. Даже когда ты пытаешься заставить это потерять вещи. : -)

0 голосов
/ 25 марта 2012

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

Теперь вы можете перенести это в новый репозиторий GitHub.

...