Бұзылған git репозиторийді жөндеу тарихы
Екі күн алдын жұмысқа келгенімде бастығым көрші компанияның gitlab сервері істемей тұрғанын, мүмкіндік болса не проблема екенін қарап беруімді сұрады. Астыңғы қабатқа түсіп, не болғанын қарай бастадым.
Бастапқы мәліметтер бойынша gitlab тұрған виртуалды машина өзінен-өзі өшіп қосылып істемей тұрған. Кейіннен оперативті жады көбейтілген соң қосылып, істей бастаған. Бірақ компания пайдаланатын ең негізгі репозиторий істемей тұр. Gitlab-та парақшасын ашсаң 500-қате. Логтарда мардымды ештеңе жоқ. Тек қана ruby белгілі бір айди бойынша объект таппағанын ғана жазған.
(Мен мұнда нақты қателерді көшіріп ала алмадым, проблема жөнделген соң барлығы ұмыт болып кетті. Келесі жолы алдын ала істеген әрекеттерді жеке жазып отпақпын.)
Сондағы бала тағы бір қатені көрсетті, сол қате жөндеудің басы болды.
Серверге кіріп, gitlab-тың репозиторий сақтайтын папкасына кіріп
(/var/opt/gitlab/git-data) git show-ref деген кезде, ол барлық тегтер мен branch-тардың сілтемелерін шығара бастады
тек қана басты branch-тың сілтемесі дұрыс емес. Қате шығарып тұр.
Егер git репозиториын дұрыстап қарайтын болсаңыз, ол келесі папкалардан тұрады:
HEAD
config
description
hooks
info
objects
refs
Бізге маңызды болған папкалар ол objects және refs. objects папкасы коммит объектілерін
сақтайды, басқаша айтқанда коммиттер осы папкада тұрады десең де болады. Бірақ өзім
де ол қалай сақтайтынын терең үңілмедім. Тек коммиттер коммит айдиінің бастапқы екі
символынан басталатын папкаларға бөлініп тасталған, папкалардың ішінде файлдың аты коммит
айдиімен бірдей файлдар жатыр. Ал refs ол басты branch-тардың коммиттерге сілтемесін сайқтайды.
Онда да branch атымен сәйкес келетін, ал ішінде коммит айдиі жазылған файлдар болады.
Жоғарыдағы айтылған проблема мынадан: refs папкасындағы branch objects папкасында жоқ
коммитке сілтеме көрсетіп тұр. Мүмкін, сервер құлаған кезде git refs папкасына мәлімет
жазып үлгергенімен objects-ке жазып үлгермеген болуы керек.
Сондағы оны шешу үшін локальді репозиторийдан git log қарап, серверге кеткен ең соңғы коммиттің айдиін
аламыз, оның objects папкасында бар екеніне көз жеткізіп, refs ішіндегі айдиді өзгертеміз (редактормен).
Бар істелген әрекет осы, gitlab пен репозиторийдің істеп кетуіне осы жеткілікті болды.