Как обновить мелкий клонированный подмодуль без увеличения основного размера репо
Я хочу преобразовать в git существующую кодовую базу с большими бинарными библиотечными файлами. Файлы библиотеки являются внешними (поставщиками) зависимостями. Эти двоичные файлы необходимы только для связи конечного приложения. Размер этих двоичных файлов огромен (2.2 Gig), поэтому, чтобы уменьшить основной размер репо (и не нужно чрезмерно увеличивать основной размер репо), я хотел бы разместить двоичные файлы в репозитории git и использовать подмодуль ссылаться только на последнюю версию бинарных файлов библиотеки.
Я могу правильно настроить мелкий subrepo, но я не знаю, как обновить до последней версии, если изменяется двоичное репо (с полной историей).
Структура репо у меня похожа на это:
main_project
sub_binary
other project files
...
Вот команды, которые позволили мне иметь мелкий подмодуль:
cd main_project
git submodule add --depth 1 file://remote_binary_repo_path sub_binary
Это работает, и sub_binary привязан к правильной версии.
Как обновить неглубокий субмодуль sub_binary
(и записать это в main_repo) до последней версии (и только последней версии) , если репозиторий удаленной библиотеки обновится?
Примечания:
- если я делаю git log sub_binary в начальной настройке подмодуля, я получаю ожидаемую историю одного коммита.
- когда я пытаюсь выполнить
git pull --depth 1
в sub_binary
, я получаю ошибку слияния: сбой автоматического слияния; исправить конфликты и затем зафиксировать результат.
- Я использую git 1.8.4
- Я прочитал ответ VonC на git Shalow Submodules, но в нем не упоминается, как обновить такой подмодуль.
Edit:
Я смог обновить подмодуль после многого обучения git (см. мой собственный ответ). Но по-прежнему существует проблема, что основное репо растет с появлением новых версий.
Для теста у меня есть двоичный файл размером 2 мега, и я клонирую мелко, чтобы создать подмодуль.
du -h
при начальном клоне после a git submodule update --init --depth 1
:
40K ./.git/hooks
4.0K ./.git/info
4.0K ./.git/logs/refs/heads
4.0K ./.git/logs/refs/remotes/origin
4.0K ./.git/logs/refs/remotes
8.0K ./.git/logs/refs
12K ./.git/logs
40K ./.git/modules/sub_binary/hooks
4.0K ./.git/modules/sub_binary/info
4.0K ./.git/modules/sub_binary/logs/refs/heads
4.0K ./.git/modules/sub_binary/logs/refs/remotes/origin
4.0K ./.git/modules/sub_binary/logs/refs/remotes
8.0K ./.git/modules/sub_binary/logs/refs
12K ./.git/modules/sub_binary/logs
0B ./.git/modules/sub_binary/objects/info
2.0M ./.git/modules/sub_binary/objects/pack
2.0M ./.git/modules/sub_binary/objects
4.0K ./.git/modules/sub_binary/refs/heads
4.0K ./.git/modules/sub_binary/refs/remotes/origin
4.0K ./.git/modules/sub_binary/refs/remotes
0B ./.git/modules/sub_binary/refs/tags
8.0K ./.git/modules/sub_binary/refs
2.1M ./.git/modules/sub_binary
2.1M ./.git/modules
4.0K ./.git/objects/70
4.0K ./.git/objects/de
4.0K ./.git/objects/info
8.0K ./.git/objects/pack
20K ./.git/objects
4.0K ./.git/refs/heads
4.0K ./.git/refs/remotes/origin
4.0K ./.git/refs/remotes
0B ./.git/refs/tags
8.0K ./.git/refs
2.2M ./.git
2.0M ./sub_binary
4.2M .
du -h
после двух или трех циклов обновления:
40K ./.git/hooks
8.0K ./.git/info
4.0K ./.git/logs/refs/heads
4.0K ./.git/logs/refs
8.0K ./.git/logs
40K ./.git/modules/sub_binary/hooks
8.0K ./.git/modules/sub_binary/info
0B ./.git/modules/sub_binary/logs/refs/heads
8.0K ./.git/modules/sub_binary/logs/refs/remotes/origin
8.0K ./.git/modules/sub_binary/logs/refs/remotes
8.0K ./.git/modules/sub_binary/logs/refs
12K ./.git/modules/sub_binary/logs
4.0K ./.git/modules/sub_binary/objects/0a
4.0K ./.git/modules/sub_binary/objects/1b
2.0M ./.git/modules/sub_binary/objects/a0
4.0K ./.git/modules/sub_binary/objects/info
4.0M ./.git/modules/sub_binary/objects/pack
6.0M ./.git/modules/sub_binary/objects
0B ./.git/modules/sub_binary/refs/heads
8.0K ./.git/modules/sub_binary/refs/remotes/origin
8.0K ./.git/modules/sub_binary/refs/remotes
0B ./.git/modules/sub_binary/refs/tags
8.0K ./.git/modules/sub_binary/refs
6.1M ./.git/modules/sub_binary
6.1M ./.git/modules
4.0K ./.git/objects/70
4.0K ./.git/objects/de
4.0K ./.git/objects/info
8.0K ./.git/objects/pack
20K ./.git/objects
4.0K ./.git/refs/heads
0B ./.git/refs/tags
4.0K ./.git/refs
6.2M ./.git
2.0M ./sub_binary
8.2M .
Поскольку я выбираю неглубоко и reset, я бы подумал, что репо будет содержать только одну копию файлов + рабочий каталог, который будет около 4 мегабайт.
Ответы
Ответ 1
В моем конкретном случае использования я не могу объединиться или извлечь из-за двоичных данных. Таким образом, решение довольно просто:
cd sub_module
git fetch --depth 1
git reset --hard origin/master
cd ..
git add sub_module
git commit -m 'updated sub_module'
Ответ 2
Так как подмодули почти всегда находятся в режиме снятой головы, тогда это не будет работать:
git fetch --depth 1
git checkout sub_binary/master
Edit:
Этот поток здесь указывает, что git pull
должен работать. Существует ли линейная история между головкой пульта и головкой подмодуля?