2014-09-25 4 views
1

Мы работаем над проблемой:Git Disaster: 1.2GB скрыт в .git

Мы работаем с данными, которые составляют около 1,2 ГБ. Поскольку мы перешли на другой формат данных, забыл поместить новый формат в .gitignore. После того, как мы заметили, что все файлы были добавлены, мы удалили их все и зафиксировали, но было уже слишком поздно, и теперь мы не можем больше нажимать на сервер, потому что он слишком большой для полосы пропускания!

мы уже пытались

sudo git filter-branch --tree-filter "rm -f *.nc" HEAD 

Но это не работает! Толчок все еще пытается вытолкнуть все ~ 3000 объектов! Итак, как мы можем действовать, потому что у нас действительно проблемы, так как невозможно общаться друг с другом.

+0

Ссылка на [this] (http://stackoverflow.com/a/8741530/113848) и [this] (http://stackoverflow.com/a/3459399/113848) для справки, хотя, похоже, что-то есть другое происходит здесь. – legoscia

+0

Можете ли вы сделать рисунок ascii для своей истории совершения и проблемы? тогда было бы намного легче понять проблему и ответить. – ryenus

+0

не можете ли вы сделать фиксацию с удалением этого файла? 'git rm BIGFILE' и нажать? – IProblemFactory

ответ

3

Да, git filter-branch - это путь.

Но так как вы собираетесь изменить историю, вы можете просто отжимают из проблемной части истории, то cherry-pick позже хорошо совершает, так же, как я недавно объяснил here.

Тогда вы можете git gc --prune удалить бесполезные огромные коммиты.

и использовать git push -f для перезаписи истории на стороне сервера.

+0

, основанный на его описании, похоже, что это может потерять данные - это будет работать только в том случае, если плохое коммиты добавили * .nc-файлы и ничего больше, что, вероятно, не так. Кроме того, вам нужно будет запустить gc на сервере. –

+0

@AndrewC, я думаю, это зависит от того, какая часть истории OP решит переработать и как «сжатие» будет сделано, если только неправильно добавленные файлы будут опущены, тогда все будет хорошо. Также пользователь может создавать теги или полагаться на 'git reflog', чтобы вернуться и перезапустить весь процесс. – ryenus

+0

Это зависит от того, действительно ли люди * только * совершили сборку. Обычно люди этого не делают. Конечно, это может произойти, но это не типично. –

0

Сначала решите, сколько проблемных вопросов вы имеете в виду. Фильтр-ветвь является мощным, но он также запутан в использовании и имеет причудливый синтаксис. Для меня, если число проблемных коммитов < 10 Я бы использовал rebase, если это> 10, я бы использовал ветвь фильтра.

Для решения ветви фильтра вы обычно используете форму -index-filter. Вы должны использовать * .nc вместо имени файла. Но вам может потребоваться добавить -r для рекурсивного, если ваши nc-файлы будут распространены, и вам может потребоваться добавить --pune-empty.

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 

Для минимального количества фиксаций git rebase -i HEAD~X будет проще. Просто измените выбор, чтобы отредактировать, вернуться и очистить коммиты, чтобы удалить плохие файлы и добавить .gitignore на место.

Как только вы это сделаете - вы исправите историю изменений. Однако вы не можете собирать мусор.

Если вы использовали ветвь фильтра, она создала кучу резервных ссылок. Вы должны удалить их с

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 

Для любого фильтра или перебазироваться решением, которое вы также должны истечь в reflogs

git reflog expire --expire=now --all 

Теперь вы можете, наконец, вернуть себе место на диск объекты принимают с

git gc --prune=now 

Это будет «исправлять» все репо, над которыми вы сейчас работаете. Если это не репо на вашем сервере, вам нужно будет принудительно нажать на сервер. Это только исправит refs на сервере, хотя, возможно, не будет восстанавливать дисковое пространство. Вам также нужно будет истекло/gc на сервере.