Наверняка если вы начали читать эту статью, то знаете, что такое git и для чего он нужен. НО не все используют такую интересную функциональность в git как submodules.
Это дает возможность прицепить к вашему проекту другие проекты и переиспользовать их в вашем. Для примера рассмотрим такую историю.
Есть репозиторий, в котором содержится groovy скрипт, который решает задачу по извлечению из системы хранения чувствительных данных Vault.
![Git репозиторий с Vault Git репозиторий с Vault](https://habrastorage.org/getpro/habr/upload_files/cfc/bab/467/cfcbab467dec52a83c2acc6283f60d4d.png)
Также есть репозиторий CICD, в которых содержатся конвейеры конкретных приложений.
![Git репозиторий с submodules Git репозиторий с submodules](https://habrastorage.org/getpro/habr/upload_files/4a6/ad1/a98/4a6ad1a985441c2173d573973b0f154a.png)
Для того, чтобы подключить репозиторий Vault к репозиторию CICD как submulde необходимо выполнить, зафиксировать commit и отправить push в ветку dev
git submodule add git@gitlab.services.ru:DevOps/cicd-store/jenkins/vault.git
git status
git diff --cached vault
git diff --cached --submodule
git commit -am 'Add vault module'
git push origin dev
в итоге появляется файл .gitsubmodules и в нем соответствующая запись
![Vault локально в Intellij Idea Vault локально в Intellij Idea](https://habrastorage.org/getpro/habr/upload_files/5c1/aab/1eb/5c1aab1ebe457be4ad9bbbdc3370f16b.png)
[submodule "vault"]
path = vault
url = git@gitlab.services.ru:DevOps/cicd-store/jenkins/vault.git
Если кстати решите отключить submudule , то необходимо сделать следующее
git submodule deinit -f vault
git rm --cached vault
физически удаляем
rm -rf vault
и удаляем из .gitmodules секцию [submodule "vault"]
Если вы что-то поменяли в репозитории Vault и хотите чтобы указатель в основном проекте был перемещен на самый новый коммит и изменения были отправлены в ветку master необходимо сделать следующее:
git submodule update --init --recursive &&
git status &&
git submodule update --remote --rebase &&
git commit -am 'Fix old commit' &&
git push origin master
Перечисление объектов: 3, готово.
Подсчет объектов: 100% (3/3), готово.
При сжатии изменений используется до 12 потоков
Сжатие объектов: 100% (2/2), готово.
Запись объектов: 100% (2/2), 241 bytes | 241.00 KiB/s, готово.
Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
To gitlab.services.ru:product/adv/cicd.git
f20bf06..2fa5cc7 master -> master
Чаше всего все работает штатно, но иногда обстоятельства складываются таким образом:
22:00 пятница и вы хотите получить именно сегодня результат, потому как потратили на этот pipeline почти целый день, просто уйти и бросить задачу - вы не только не получите свою дозу дофамина, а у вас еще выработается дополнительная доза кортизола,
в какой-то момент вы видите, что вот оно почти готово и своему коллеге по работе который почему-то тоже задержался вы говорите еще 30 минут и мы пойдем,
на 25 минуте у вас получилось наконец-то полностью доделать pipeline и протестировать deployment.yml и теперь осталось дело за малым раскомментировать stage с build и протестировать снова и в процессе внести косметическое изменение в проект в vault, вы нормально коммитите в соответствующие репозитории и на основном проекте выполняете
git submodule update --init --recursive &&
git status &&
git submodule update --remote --rebase &&
git commit -am 'Fix old commit' &&
git push origin master
но что-то идет не так и когда вы запускаете Job в Jenkins возвращается ошибка
[Pipeline] End of Pipeline
hudson.plugins.git.GitException: Command "git submodule update --init --recursive vault" returned status code 1:
stdout:
stderr: |-----------------------------------------------------------------|
| This system is for the use of authorized users only. |
| Individuals using this computer system without authority, or in |
| excess of their authority, are subject to having all of their |
| activities on this system monitored and recorded by system |
| personnel. |
| |
| In the course of monitoring individuals improperly using this |
| system, or in the course of system maintenance, the activities |
| of authorized users may also be monitored. |
| |
| Anyone using this system expressly consents to such monitoring |
| and is advised that if such monitoring reveals possible |
| evidence of criminal activity, system personnel may provide the |
| evidence of such monitoring to law enforcement officials. |
|-----------------------------------------------------------------|
fatal: reference is not a tree: 63f0d683a3842bc6bffc13524803560e1e725086
Unable to checkout '63f0d683a3842bc6bffc13524803560e1e725086' in submodule path 'vault'
пробуете перейти в giltab по ссылке vaurt @ то вам возвращается 404 ошибка
![404 ошибка при попытке перехода на git submodule vault 404 ошибка при попытке перехода на git submodule vault](https://habrastorage.org/getpro/habr/upload_files/f24/f9b/6f0/f24f9b6f0ef5e91d73239af7d3a31c2a.png)
Для примера нашел подобные ошибки на toster.ru
![https://qna.habr.com/q/131671 https://qna.habr.com/q/131671](https://habrastorage.org/getpro/habr/upload_files/be1/9cb/067/be19cb06722d14be9ce5be5acecff712.png)
В ответе было написано что гуглится 10 секунд, но четкого скрипта как восстановить работоспособность найдено не было и я решил что моя история как это быстро починить репозиторий CICD будет полезна
Начинаем с клонировая репозитория
git clone <repo>
далее необходимо сделать инициализацию submodule
git submodule init
Подмодуль «vault» (git@gitlab.services.ru:DevOps/cicd-store/jenkins/vault.git)
зарегистрирован по пути «vault»
далее выполняем рекурсивный update
git submodule update --recursive --remote
далее пробуем выполнить update именно sub модуля vault
git submodule update --init --recursive vault
получаем в ответ ошибку
| This system is for the use of authorized users only. |
| Individuals using this computer system without authority, or in |
| excess of their authority, are subject to having all of their |
| activities on this system monitored and recorded by system |
| personnel. |
| |
| In the course of monitoring individuals improperly using this |
| system, or in the course of system maintenance, the activities |
| of authorized users may also be monitored. |
| |
| Anyone using this system expressly consents to such monitoring |
| and is advised that if such monitoring reveals possible |
| evidence of criminal activity, system personnel may provide the |
| evidence of such monitoring to law enforcement officials. |
|-----------------------------------------------------------------|
fatal: git upload-pack: not our ref 63f0d683a3842bc6bffc13524803560e1e725086
fatal: ошибка внешнего репозитория: upload-pack: not our ref 63f0d683a3842bc6bffc13524803560e1e725086
Получен по пути подмодуля «vault», но не содержит 63f0d683a3842bc6bffc13524803560e1e725086.
Сбой при прямом получении коммита.
переходим в каталог vault и проверяем та ли ветка которая нужна мы сейчас используем
cd vault
git branch
* (HEAD отделён на bf2f348)
v1
ветка верная v1
далее выполняем актуализацию
git checkout v1
Переключено на ветку «v1»
Ваша ветка обновлена в соответствии с «origin/v1».
мы обновили каталог с sub modules до последнего коммита repo с vault, теперь необходимо перейти в каталог с основным проектом и сохранить изменения
cd ..
git commit -am 'Fix old commit with vault'
[master 37b2fa0] Fix old commit with vault
1 file changed, 1 insertion(+), 1 deletion(-)
далее зафиксированные изменения мы отправляем в репозиторий с проектом
git push origin master
|-----------------------------------------------------------------|
| This system is for the use of authorized users only. |
| Individuals using this computer system without authority, or in |
| excess of their authority, are subject to having all of their |
| activities on this system monitored and recorded by system |
| personnel. |
| |
| In the course of monitoring individuals improperly using this |
| system, or in the course of system maintenance, the activities |
| of authorized users may also be monitored. |
| |
| Anyone using this system expressly consents to such monitoring |
| and is advised that if such monitoring reveals possible |
| evidence of criminal activity, system personnel may provide the |
| evidence of such monitoring to law enforcement officials. |
|-----------------------------------------------------------------|
Перечисление объектов: 3, готово.
Подсчет объектов: 100% (3/3), готово.
При сжатии изменений используется до 12 потоков
Сжатие объектов: 100% (1/1), готово.
Запись объектов: 100% (2/2), 249 bytes | 249.00 KiB/s, готово.
Total 2 (delta 1), reused 1 (delta 1), pack-reused 0
To gitlab.services.ru:product/adv/cicd.git
1e35cdf..37b2fa0 master -> master
проверяем repo с проектом, что все сработало как нужно
![commit Fix old commit with vault commit Fix old commit with vault](https://habrastorage.org/getpro/habr/upload_files/5ab/c85/2c4/5abc852c4cb32e079d2a7958002f8612.png)
переходим по ссылке после @
![восстановленная ссылка git submodule на репозиторий с Vault восстановленная ссылка git submodule на репозиторий с Vault](https://habrastorage.org/getpro/habr/upload_files/768/144/6b3/7681446b399e19d3c11e508fe39c2159.png)
если до этого мы все сделали правильно, то ссылка должна открыться.
sav6622
Вопрос в другом, почему с субмодулями постоянно какие-то проблемы...
drno-reg Автор
были и другие, но они были по-проще и нормально решались рекурсивным update. Эта воспроизвелась 2 раза на прошлой неделе, пока грешу на себя, так как в режиме ограниченного времени: когда думаешь о коде и машинально что-то там commit & push
sav6622
На собственном опыте использования submodule под git (у svn такой проблемы не было) - регулярно слетает указатель на submodule, причем хаотично и непонятна причина такого поведения - после этого начинаются танцы с бубном.
Aquahawk
Мой ответ в том что гит это набор инструментов, а не готовый пайплайн работы. И самое печальное что гит не позволяет внятно пайплайн зафиксировать в репо. С сабмодулями очень легко ошибиться, и вообще сабмодули это боль, особенно когда они становятся рекурсивными. Мы пилили монорепу на сабрепы, сейчас собираем её назад. С монорепой жить сильно проще.
petropavel
У нас никаких проблем с сабмодулями нет. Может вы просто не умеете их готовить?
Вот как автор, например? Который кастит определённую последовательность заклинаний, начинающихся с
git submodule
. Если что не работает — погуглить ошибку и повторить заклинания оттуда. В крайнем случаепереинсталлировать windowsпереклонировать и пересоздать сабмодуль. Объяснения, что произошло, в статье почему-то не было.А ведь всё просто, сабмодуль — это просто отдельный независимый репозиторий. А CICD репозиторий просто говорит на какой коммит надо делать checkout. Автор поменял что-то в сабмодуле. Пушнул? Неизвестно. Но даже если и пушнул, у него потом
git submodule update --rebase
. Rebase, Карл! Rebase сделал своё дело, хэши у коммитов в сабмодуле поменялись. Пушнул автор это? Точно нет. А CICD он пушнул.Вот его дженкинс делает checkout CICD, тот говорит, мне нужен такой-то коммит из сабмодуля. А автор этот коммит не пушнул, не полезет же дженкинс к автору на лаптоп? Это как переслать кому-то симлинк вместо самого файла.
Фиксится очевидно как, надо пушнуть сабмодуль.
drno-reg Автор
я детализированно до подробностей не скажу как мне удалось поломать, было поздно, делал на рефлексах, ваша версия происходящего имеет место на правду, но нужно было выходить из этой ситуации - починить и метод починки был такой и дал положительный результат.