Недавно је на мејлинг листи misc@ OpenBSD-а у теми о омиљеним програмима за репликацију система поменут got — Game Of Trees („игра стабала“), што ме је заинтересовало за овај систем за контролу верзија. За њега сам чуо и раније, али сам сада одлучио да га боље проучим и започнем процес преласка са git-а na got.
На питање „Чему све ово? Зашто просто не користити Git?“ у „често постављаним питањима“ got-а, тренутно је дат, по мом мишљењу, непотребно одвраћајући одговор:
We don't need to hear your opinion that our project is pointless because Git is superior. Thank you!
тј.
Не треба нам ваше мишљење да је наш пројекат бесмислен зато што је Git бољи, хвала!
Овакав одговор маши поенту. Неко ко не познаје got и заиста је заинтересован за разлог његовог постојања, без намере да га омаловажава, остаје ускраћен за одговор. Такође је, слично пројекту Џемини, употребљена (по мени неискрена, и то непотребно) ограда да got „нема намеру да замени git“, и да је „било ко ко намерава да протури идеју замене git-а got-ом у великој заблуди“. Како да не! И зашто да не?
Коришћењем got-а постају јасне његове предности и оправданост његовог постојања. Got се према git-у односи отприлике као OpenBSD према било ком мејнстрим систему ГНУ-а са Линуксом: фокусирање на оно што је битно, без непотребних могућности које се ретко користе или се могу урадити на други начин, већ постојећим програмима, а које уз то само стварају додатне мете за пробијање безбедности. Got је, у ствари, git који поштује основне вредности OpenBSD-а. Уз све то, got користи исти формат репозиторијума као и git, само што је сваки репозиторијум у њему „го“ („bare“), и радно стабло (work tree) се мора експлицитно направити из репозиторијума. Директоријум радног стабла се не сме преклапати са директоријумом репозиторијума, а got користи уграђене механизме OpenBSD-а, као што је unveil(2), да ограничи свој приступ и радном стаблу и репозиторијуму само на минимум неопходан за функционисање.
За сада једини ресурс за учење got-а су његове странице упутства и упоредни преглед got-а и осталих постојећих система за контролу верзија, као што су CVS, SVN и git. Учећи got из ових докумената, мој први пројекат који сам пребацио на got је програм table, а између осталог, got омогућава далеко елегантније генерисање верзије и датума последњег чувања. Рецимо:
got log | awk ' /^date: / { gsub(/^date: /,"",$0); print $2 " " $3 ", " $5 exit }' >date.new
наспрам:
LC_ALL=C export LC_ALL user=$(unalias ls >/dev/null 2>&1 || true; \ command ls -ld . | awk '{print $3}') e_user=$(id -un) if [ "$e_user" = "$user" ]; then git log --format=format:%cd \ --date=format:"%B %d, %Y" -1 @ >date.new else su "${user}" -c 'env LC_ALL=C git log --format=format:%cd \ --date=format:"%B %d, %Y" -1 @' >date.new fi echo >>date.new
Комплекснији код је последица тога што git, за разлику од got-а, не дозвољава кориснику root да извршава наредбе у корисничком репозиторијуму без подешавања safe.directory у /root/.gitconfig.