Как стать автором
Поиск
Написать публикацию
Обновить

Git Submodule иногда ломаются, как их починить?

Время на прочтение5 мин
Количество просмотров19K

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

Это дает возможность прицепить к вашему проекту другие проекты и переиспользовать их в вашем. Для примера рассмотрим такую историю.

Есть репозиторий, в котором содержится groovy скрипт, который решает задачу по извлечению из системы хранения чувствительных данных Vault.

Git репозиторий с Vault
Git репозиторий с Vault

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

Git репозиторий с submodules
Git репозиторий с submodules

Для того, чтобы подключить репозиторий 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
[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

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

https://qna.habr.com/q/131671
https://qna.habr.com/q/131671

В ответе было написано что гуглится 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

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

восстановленная ссылка git submodule на репозиторий с Vault
восстановленная ссылка git submodule на репозиторий с Vault

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

Теги:
Хабы:
Всего голосов 14: ↑5 и ↓9-3
Комментарии6

Публикации

Ближайшие события