Как обновить неглубокий клонированный субмодуль без увеличения размера основного репо
Я хочу преобразовать в git существующую кодовую базу, в которой есть большие файлы двоичных библиотек. Файлы библиотеки являются внешними (от поставщика) зависимостями. Эти двоичные файлы необходимы только для связи конечного приложения. Размер этих бинарных файлов огромен (2, 2 гигабайта), поэтому, чтобы уменьшить размер основного репо (и не нужно чрезмерно увеличивать размер основного репо), я бы хотел разместить бинарные файлы в git-репо и использовать субмодуль для Ссылка только на последнюю версию двоичных файлов библиотеки.
Я могу правильно настроить мелкий подпункт, но я не знаю, как обновить его до последней версии, если бинарный репо (с полной историей) изменится.
Структура репо у меня похожа на это:
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 Shallow Submodules, но там не упоминается, как обновить такой подмодуль.
Редактировать:
Я смог обновить субмодуль после большого изучения мерзавцев ( см. Мой собственный ответ). Но есть еще проблема, что основной репо растет по мере поступления новых версий.
Для теста у меня есть бинарный файл размером 2 мегабайта, и я мелко клонируюсь, чтобы создать субмодуль. du -h
в начальном клоне после 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 .
Поскольку я получаю мелкую загрузку и сбрасываю, я думаю, что репо будет содержать только одну копию файлов + рабочий каталог, который будет около 4 мегабайт.
2 ответа
В моем конкретном случае использования я не могу объединить или извлечь из-за двоичных данных. Так что решение довольно простое:
cd sub_module
git fetch --depth 1
git reset --hard origin/master
cd ..
git add sub_module
git commit -m 'updated sub_module'
Поскольку подмодули почти всегда находятся в режиме отсоединенной головки, это не сработает:
git fetch --depth 1
git checkout sub_binary/master
Редактировать:
Эта тема здесь указывает на то, что git pull
должно сработать. Есть ли линейная история между головкой пульта и головкой субмодуля?