Наверняка если вы начали читать эту статью, то знаете, что такое git и для чего он нужен. НО не все используют такую интересную функциональность в git как submodules.
Это дает возможность прицепить к вашему проекту другие проекты и переиспользовать их в вашем. Для примера рассмотрим такую историю.
Есть репозиторий, в котором содержится groovy скрипт, который решает задачу по извлечению из системы хранения чувствительных данных Vault.
Git репозиторий с Vault
Также есть репозиторий CICD, в которых содержатся конвейеры конкретных приложений.
Git репозиторий с submodules
Для того, чтобы подключить репозиторий Vault к репозиторию CICD как submulde необходимо выполнить, зафиксировать commit и отправить push в ветку dev
git submodule add git@gitlab.services.ru
evOps/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
[submodule "vault"] path = vault url = git@gitlab.services.ru
evOps/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
roduct/adv/cicd.git
f20bf06..2fa5cc7 master -> master
Чаше всего все работает штатно, но иногда обстоятельства складываются таким образом:
но что-то идет не так и когда вы запускаете Job в Jenkins возвращается ошибка
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
Для примера нашел подобные ошибки на toster.ru
qna.habr.com
В ответе было написано что гуглится 10 секунд, но четкого скрипта как восстановить работоспособность найдено не было и я решил что моя история как это быстро починить репозиторий CICD будет полезна
Начинаем с клонировая репозитория
git clone <repo>
далее необходимо сделать инициализацию submodule
git submodule init
Подмодуль «vault» (git@gitlab.services.ru
evOps/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
roduct/adv/cicd.git
1e35cdf..37b2fa0 master -> master
проверяем repo с проектом, что все сработало как нужно
commit Fix old commit with vault
переходим по ссылке после @
восстановленная ссылка git submodule на репозиторий с Vault
если до этого мы все сделали правильно, то ссылка должна открыться.
habr.com
Это дает возможность прицепить к вашему проекту другие проекты и переиспользовать их в вашем. Для примера рассмотрим такую историю.
Есть репозиторий, в котором содержится groovy скрипт, который решает задачу по извлечению из системы хранения чувствительных данных Vault.

Также есть репозиторий CICD, в которых содержатся конвейеры конкретных приложений.

Для того, чтобы подключить репозиторий Vault к репозиторию CICD как submulde необходимо выполнить, зафиксировать commit и отправить push в ветку dev
git submodule add git@gitlab.services.ru
git status
git diff --cached vault
git diff --cached --submodule
git commit -am 'Add vault module'
git push origin dev
в итоге появляется файл .gitsubmodules и в нем соответствующая запись

[submodule "vault"] path = vault url = git@gitlab.services.ru
Если кстати решите отключить 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
f20bf06..2fa5cc7 master -> master
Чаше всего все работает штатно, но иногда обстоятельства складываются таким образом:
- 22:00 пятница и вы хотите получить именно сегодня результат, потому как потратили на этот pipeline почти целый день, просто уйти и бросить задачу - вы не только не получите свою дозу дофамина, а у вас еще выработается дополнительная доза кортизола,
- в какой-то момент вы видите, что вот оно почти готово и своему коллеге по работе который почему-то тоже задержался вы говорите еще 30 минут и мы пойдем,
- на 25 минуте у вас получилось наконец-то полностью доделать pipeline и протестировать deployment.yml и теперь осталось дело за малым раскомментировать stage с build и протестировать снова и в процессе внести косметическое изменение в проект в vault, вы нормально коммитите в соответствующие репозитории и на основном проекте выполняете
но что-то идет не так и когда вы запускаете Job в Jenkins возвращается ошибка
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 ошибка

Для примера нашел подобные ошибки на toster.ru


Git submodules reference is not a tree как решить?
Ответили на вопрос 2 человека. Оцените лучшие ответы! И подпишитесь на вопрос, чтобы узнавать о появлении новых ответов.
Начинаем с клонировая репозитория
git clone <repo>
далее необходимо сделать инициализацию submodule
git submodule init
Подмодуль «vault» (git@gitlab.services.ru
далее выполняем рекурсивный 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
1e35cdf..37b2fa0 master -> master
проверяем repo с проектом, что все сработало как нужно

переходим по ссылке после @

восстановленная ссылка git submodule на репозиторий с Vault
если до этого мы все сделали правильно, то ссылка должна открыться.

Git Submodule иногда ломаются, как их починить?
Наверняка если вы начали читать эту статью, то знаете, что такое git и для чего он нужен. НО не все используют такую интересную функциональность в git как submodules. Это дает возможность прицепить к...
