удалить из Git файл большого размера попавший туда несколько коммитов назад

251
24 мая 2017, 04:58

Опыт java и Git ~1 месяц, ОС linux mint.

Нужна ваша помощь:

1.В начале забыл добавить в .gitignore папку target/ в которой хранятся скомпилированные *.jar *.class и прочие файлы. 2.позже через несколько коммитов обнаружил что папка .git весит 12+ мегабайт, по размеру предполагаю что это забытый мной jar файл (кода у меня ~15 килобайт, все .class файлы ~14 килобайт) 3.нашел этот файл руками он весит 12 МБ и лежит в папке

.git/objects/pack/pack-2af1dfb851dabe3d606e0d0f9ad7ba84fd74f043.idx 

Прошел несколько вопросов на русском и английском stackoverflow + google пробовал следующее:

  1. git filter-branch --index-filter 'git rm --cached --ignore-unmatch FILENAME' --prune-empty -- --all
  2. git filter-branch --index-filter 'git rm --cached --ignore-unmatch FILENAME' HEAD
  3. git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch FILENAME' --prune-empty --tag-name-filter cat -- --all

Вместо FILENAME пробовал подставлять вот это:

  • target/gs-rest-service-0.1.0.jar
  • gs-rest-service-0.1.0.jar
  • target/
  • *.jar

толку не дало.

В итоге у меня 2 вопроса: -Как выяснить что это весит 12МБ в папке .git и как это удалить?

вот ссылка на мо проект на github, можно скачать как zip-архив или клонировать:

git clone https://github.com/jiraff537/tic-tac-toe-RESTfulWebService.git

(да я пытаюсь написать Rest-бэкэнд на Spring Boot'e для крестиков-ноликов)

Answer 1

вы можете посмотреть содержимое каталога target (во всех коммитах):

$ git filter-branch --tree-filter 'ls -l target'
Rewrite c05ea07d436c9e6c96f9e441bd469ae89d6383b4 (1/29)total 14056
drwxr-xr-x 3 user user     4096 May 23 14:27 classes
-rw-r--r-- 1 user user 14352691 May 23 14:27 gs-rest-service-0.1.0.jar
-rw-r--r-- 1 user user     3829 May 23 14:27 gs-rest-service-0.1.0.jar.original
drwxr-xr-x 2 user user     4096 May 23 14:27 maven-archiver
drwxr-xr-x 3 user user     4096 May 23 14:27 maven-status
...

или информацию о конкретном файле target/gs-rest-service-0.1.0.jar:

$ git filter-branch --tree-filter 'ls -l target/gs-rest-service-0.1.0.jar'
Rewrite c05ea07d436c9e6c96f9e441bd469ae89d6383b4 (1/29)
-rw-r--r-- 1 user user 14352691 May 23 14:29 target/gs-rest-service-0.1.0.jar
...

удалить файл во всех коммитах можно, например, так:

$ git filter-branch --tree-filter 'rm -f target/gs-rest-service-0.1.0.jar'
Rewrite f2133e7b3d7f209f43e88b802a6589cb2a1eadfd (29/29)
Ref 'refs/heads/master' was rewritten

после такого переписывания истории в своём локальном репозитории вам придётся перезаписать историю и в репозитории на сайте github.com, добавив опцию -f (--force) команде push:

$ git push -f

p.s. если репозиторий был склонирован ещё куда-то/кем-то, то там/тому надо будет принудительно переключиться на отправленную вами переписанную историю:

$ git fetch
$ git reset --hard origin/master

или просто заново склонировать репозиторий в пустой каталог.

как это удалить?

после того, как вы перезаписали историю, объект типа blob, содержащий удалённый файл, стал «осиротевшим». чтобы удалить его, надо воспользоваться командой gc (gargabe collection):

$ git gc
Counting objects: 500, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (222/222), done.
Writing objects: 100% (500/500), done.
Total 500 (delta 221), reused 413 (delta 172)

как показывает вывод команды $ du -sb .git (выполненной до и после $ git gc), занимаемый каталогом .git объём изменился на 242997 байт (13254649-13011652). вероятно, именно столько занимал удалённый файл (в сжатом виде).

после того, как вы перезаписали свою локальную историю, удалённый файл (пока) не стал «осиротевшим» — на него есть ссылки из (пока не переписанной) истории подключенного репозитория (который на github-е находится). после того, как вы перепишете историю и на github-е, команда

$ git gc

должна будет удалить объект типа blob, содержащий этот «осиротевший» файл.

дополнение

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

$ git gc; git prune; git repack -ad

ваш репозиторий (т.е., содержимое каталога .git), после удаления того большого файла, и полной переупаковки, стал занимать у меня 187165 байт.

READ ALSO
Кастомизация списков

Кастомизация списков

Каким образом можно создать что-то наподобие этого (смизображение)? Свой адаптер писать или как-то ещё можно?

228
Java-конфигурация log4j

Java-конфигурация log4j

Мне нужно что бы при достижении определенного размера, файл лога создавался новый и их могло быть к примеру 5 штук всегоИ после того как будет...

213
импорт классов-наследников

импорт классов-наследников

Как получить доступ к классу из другого пакета? То есть: в пакете packageА есть класс Class1 и класс Class2 extends Class1 В пакете packageB у меня получается заимпортировать...

183