Перенесенный репозиторий GIT намного меньше оригинала

#git #gitlab

#git #gitlab

Вопрос:

У меня есть репозиторий, хранящийся в файловой системе, который мне нужно перенести в репозиторий HTTPS git. Проблема в том, что перенесенный репозиторий меньше исходного, 179M против 545 MB, если быть точным.

Вот как выглядит исходное репозиторий:

 $ tree -L 2 .git

.git/
├── branches
├── config
├── FETCH_HEAD
├── HEAD
├── hooks
├── index
├── logs
│   └── refs
├── objects
│   ├── incoming_1638816568970138516.pack
│   ├── incoming_2231423675192085195.pack
│   ├── incoming_252567842603709439.pack
│   ├── incoming_2956015230264054740.pack
│   ├── incoming_3048626775278812485.pack
│   ├── incoming_3322152774343971530.pack
│   ├── incoming_3707332777993276763.pack
│   ├── incoming_407171399829023385.pack
│   ├── incoming_4072000993266381297.pack
│   ├── incoming_4293432441900999175.pack
│   ├── incoming_4833572675284287989.pack
│   ├── incoming_4943537936436869872.pack
│   ├── incoming_5555086829860720971.pack
│   ├── incoming_5912835395946639495.pack
│   ├── incoming_7273182803237175093.pack
│   ├── incoming_7510898138918506599.pack
│   ├── incoming_7865231230366160752.pack
│   ├── incoming_8724975206375007218.pack
│   ├── incoming_8787762604831244623.pack
│   ├── incoming_9046531469688239004.pack
│   ├── info
│   └── pack
└── refs
    ├── heads
    ├── remotes
    └── tags


$ git branch -a

  cli
  max
  codefactoring
* master
  new-load-configuration
  new-loader
  plugins_dev
  remotes/origin/cli
  remotes/origin/max
  remotes/origin/codefactoring
  remotes/origin/master

$ du -sh .
545M    .
  

Это процедура миграции, которой я следовал:

 $ mkdir temp_dir amp;amp; cd temp_dir
$ git clone --mirror /path/to/original/repo
$ cd /path/to/original/repo
$ git remote add new-origin  https://myuser@my.source.server/myuser/repo.git
$ git push new-origin --mirror
  

И затем, если я посмотрю на результирующий размер репозитория, он составит 179 МБ.

Есть идеи о том, что здесь происходит?

Спасибо.

Ответ №1:

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

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

Вы можете попробовать использовать git gc (или один из его более агрессивных вариантов) в исходном репозитории, чтобы посмотреть, сможете ли вы его еще больше уменьшить.

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

Ответ №2:

Я бы сказал, что разница заключается в том, что ваш исходный репозиторий не является открытым, а перенесенный репозиторий является пустым. Поэтому 545 МБ включает в себя размер рабочего дерева, который отсутствует в перенесенном репозитории. Приписывание всей разницы в размерах (545 МБ — 179 МБ = 366 МБ) рабочему дереву может быть правдоподобным по следующим причинам:

  1. Объекты в репозитории сжимаются, а в рабочем дереве — нет. Таким образом, в репозитории с достаточно короткой историей и / или сильно сжимаемым содержимым рабочее дерево может заметно превышать содержимое .git .

  2. Рабочее дерево может содержать неотслеживаемые файлы (например, артефакты сборки).

Комментарии:

1. Клонированный репозиторий меньше. Таким образом, даже если бы на удаленном компьютере было рабочее дерево (что не так, потому что OP проверяет только размер .git ), объяснение было бы обратным.

2. @poke Под удаленным репозиторием я подразумеваю перенесенный репозиторий .

3. @poke OP не проверяет размер .git only . tree выполняется для .git , но du выполняется для .

4. спасибо за ответ! Мои команды непонятны — я запустил du в каталоге .git.