{"id":39,"date":"2009-02-02T15:48:40","date_gmt":"2009-02-02T14:48:40","guid":{"rendered":"http:\/\/jaceksalacki.pl\/?p=39"},"modified":"2011-04-18T22:57:07","modified_gmt":"2011-04-18T21:57:07","slug":"jak-uzywac-kontroli-wersji","status":"publish","type":"post","link":"https:\/\/jaceksalacki.pl\/index.php\/2009\/02\/02\/jak-uzywac-kontroli-wersji\/","title":{"rendered":"Jak u\u017cywa\u0107 kontroli wersji"},"content":{"rendered":"<p><strong>&#8230; a jak nie?<\/strong><\/p>\n<p>Prawdopodobnie ka\u017cdy, kto przynajmniej raz pr\u00f3bowa\u0142 na powa\u017cnie programowa\u0107, zetkn\u0105\u0142 si\u0119 z systemami kontroli wersji. W firmach deweloperskich czy dzia\u0142ach IT korporacji(no mo\u017ce troch\u0119 mniej), cvs czy svn jest wr\u0119cz podstawowym narz\u0119dziem (przynajmniej powinien by\u0107). Niestety, cz\u0119sto nie jest to dobrze wykorzystywane narz\u0119dzie. Cz\u0119sto svn ko\u0144czy jako takie \u0142atwiejsze w obs\u0142udze narz\u0119dzie do tworzenia kolejnych kopii folder\u00f3w, a nawet w pewnych sytuacjach zaczyna tworzy\u0107 wi\u0119cej utrudnie\u0144 ni\u017c rozwi\u0105zuje ich rozwi\u0105zuje.<!--more--><\/p>\n<p>Omawiane problemy nie dotycz\u0105 &#8222;niskopoziomowego&#8221; wykorzystania svn-a, czyli umiej\u0119tno\u015bci zrobienia repozytorium i pobrania czy zapisania danych. O ile repozytoria s\u0105 przewa\u017cnie dobrze za\u0142o\u017cone,\u00a0 praktycznie ka\u017cdy umie wykona\u0107 commit czy utworzy\u0107 i aktualizowa\u0107 lokaln\u0105 kopi\u0119, to og\u00f3lna koncepcja\u00a0 zastosowania kontroli wersji w swojej pracy le\u017cy.Czyli &#8211; wiemy jak u\u017cy\u0107 m\u0142otka do wbicia gwo\u017adzia, ale po co te gwo\u017adzie, w co je wbi\u0107,\u00a0 jak du\u017co i gdzie\u00a0 to ju\u017c nie bardzo.<\/p>\n<p>Zak\u0142adam, \u017ce czytaj\u0105cy posiadaj\u0105 podstawow\u0105 wiedz\u0119 w zakresie u\u017cycia svna. Nie b\u0119d\u0119 zajmowa\u0142 si\u0119 tym jak zrobi\u0107 commit czy checkout, jak stworzy\u0107 repozytorium itd., lecz przejd\u0119 do koncepcji zastosowania system\u00f3w kontroli wersji.<\/p>\n<h2>Co to kontrola wersji?<\/h2>\n<p>Zacznijmy od tego czym w\u0142a\u015bciwie jest kontrola wersji. Przed u\u017cyciem jakiekolwiek narz\u0119dzia warto si\u0119 zastanowi\u0107 po co i do czego ma s\u0142u\u017cy\u0107.\u00a0 Pow\u00f3d &#8222;bo jest modne i koledzy te\u017c to maj\u0105&#8221; nie jest wystarczaj\u0105cy. Oczywi\u015bcie na to pytanie, ka\u017cdy powinien sobie odpowiedzie\u0107 sam, jednak w\u015br\u00f3d najcz\u0119stszych przyczyn u\u017cycia narz\u0119dzi do wersjonowania kodu mo\u017cna wymieni\u0107:<\/p>\n<ul>\n<li>wsp\u00f3ln\u0105, jednoczesn\u0105 prac\u0119 wielu os\u00f3b nad tym samym plikiem\/zbiorem plik\u00f3w<\/li>\n<li>mo\u017cliwo\u015b\u0107 przywr\u00f3cenia dowolnego stanu wcze\u015bniejszego<\/li>\n<li>wskazanie na osob\u0119 odpowiedzialn\u0105 za wprowadzon\u0105 zmian\u0119<\/li>\n<li>prowadzenie wielu \u015bcie\u017cek rozwoju kodu czy dokumentu<\/li>\n<\/ul>\n<h2>Najwa\u017cniejsze problemy<\/h2>\n<h3>Anemicznym repozytoriom m\u00f3wimy nie<\/h3>\n<p>W zasadzie cz\u0119\u015b\u0107 ci\u0119\u017cko nazwa\u0107 pope\u0142nieniem b\u0142\u0119du &#8211; w zasadzie jest to NIE u\u017cycie mo\u017cliwo\u015bci jakie daje narz\u0119dzie.\u00a0 Najcz\u0119\u015bciej wygl\u0105da to tak: powstaje repozytorium, do repozytorium jest wrzucony pocz\u0105tkowy kod i tyle. Repozytorium nie ma \u017cadnej struktury, nie ma \u017cadnych zasad zapisu do niego, kod l\u0105duje w g\u0142\u00f3wnym katalogu, jedyne wykorzystywane funkcje to <em>commit<\/em> i <em>checkout<\/em>. Dalszy rozw\u00f3j idzie sobie tak po prostu, kod jest \u015bci\u0105gany i wprowadzany do repozytorium wg. uznania u\u017cytkownika.<\/p>\n<p>Czyli tak &#8211; co prawda mamy system tworzenia kopii (wersji), wersje s\u0105 poprawnie tworzone, mo\u017cna ustali\u0107 kto jest odpowiedzialny za jaki kawa\u0142ek kodu (dobrze, nie zawsze ale to dalej*), ale nic wi\u0119cej:<\/p>\n<ul>\n<li>nie mo\u017cna wzi\u0105\u0107 kodu z pnia repozytorium i by\u0107 pewnym jego stanu &#8211; skoro ka\u017cdy tam wrzuca i nie ma \u017cadnych zasad tych dzia\u0142a\u0144, to mo\u017ce si\u0119 znale\u017a\u0107 kod kt\u00f3ry nie daje si\u0119 nawet uruchomi\u0107<\/li>\n<li>u\u017cytkownicy maj\u0105 problem z rozpocz\u0119ciem du\u017cych prac, typu zmiana struktury projektu, bo albo zaprzestan\u0105 wersjonowania swojej pracy albo utrudni\u0105 prac\u0119 innym<\/li>\n<li>tak naprawd\u0119 wiele os\u00f3b nie mo\u017ce jednocze\u015bnie pracowa\u0107, przynajmniej nie w zespo\u0142ach wi\u0119kszych ni\u017c 3 osoby &#8211; kod jest r<\/li>\n<\/ul>\n<p>* Wersja ekstremalna &#8211; jest repozytorium, s\u0105 commity, ale commity s\u0105 robione przez jednego u\u017cytkownika. Nie dlatego, \u017ce jest to jednoosobowy projekt. Dlatego,\u00a0 \u017ce np. nikt o tym nie pomy\u015bla\u0142 i z lenistwa utworzono jednego usera dla repozytorium, lub te\u017c z powodu organizacji sieci, serwer\u00f3w itp, tylko jeden u\u017cytkownik mo\u017ce si\u0119 zalogowa\u0107 do danego komputera z repozytorium.<\/p>\n<h3>Free as a bird<\/h3>\n<p>Czyli ka\u017cdy robi co chce (z repozytorium oczywi\u015bcie). Nie ma ustalonych zasad wykorzystania narz\u0119dzia,\u00a0 ka\u017cdy u\u017cytkownik wymy\u015bla wi\u0119c w\u0142asne i wg. nich pracuje. W efekcie, tworz\u0105c now\u0105 kopi\u0119 z repozytorium, nie mo\u017cna okre\u015bli\u0107 w jakim jest stanie, np. czy zawiera najnowsz\u0105 wersj\u0119 pracy wszystkich, czy te\u017c jest echem zamierzch\u0142ej przesz\u0142o\u015bci, bo ka\u017cdy komituje najwy\u017cej co 2 tygodnie, czy w og\u00f3le pobrany kod da rad\u0119 uruchomi\u0107, bo przecie\u017c nie ustalono \u017ce w repozytorium ma si\u0119 znale\u017a\u0107 tylko dzia\u0142aj\u0105cy kod.<\/p>\n<h3>Kosz na \u015bmieci<\/h3>\n<p>Problem cz\u0119\u015bciowo zwi\u0105zany z poprzednim &#8211; je\u017celi nie ma okre\u015blonych zasad korzystania, to nie jest te\u017c okre\u015blone co powinno si\u0119 znale\u017a\u0107 w repozytorium.\u00a0 Czyli trafiaj\u0105 tam wszelkie mo\u017cliwe \u015bmieci jakie znajd\u0105 si\u0119 w katalogu kopii lokalnej &#8211; pliki tymczasowe edytora, lokalne konfiguracje IDE, dane sesji testowych. Z drugiej strony, zjawisko zwi\u0105zane z poj\u0119ciem &#8222;zarz\u0105dzanie konfiguracj\u0105&#8221;, a w\u0142a\u015bciwie z brakiem takiego zarz\u0105dzania &#8211;\u00a0 do repozytorium nie trafiaj\u0105 rzeczy kt\u00f3re s\u0105 istotne, wr\u0119cz konieczne, do uruchomienia kodu &#8211; np. informacje o wykorzystywanych bibliotekach.<\/p>\n<h3>Kontrola wersji, kontrol\u0105 wersji, ale ja wiem lepiej<\/h3>\n<p>Ponownie sytuacja zwi\u0105zana z zarz\u0105dzaniem konfiguracj\u0105, a w\u0142a\u015bciwie brakiem takowej. Objawy najcz\u0119\u015bciej przyjmuj\u0105 posta\u0107:<\/p>\n<ul>\n<li>&#8221; to ja tu szybko poprawi\u0119 na serwerze&#8221; &#8211; czyli programista zamiast wprowadzi\u0107 zmian\u0119 w lokalnej kopii, zrobi\u0107 commit, utworzy\u0107 pakiet instalacyjny i go uruchomi\u0107, poprawia kod bezpo\u015brednio w ju\u017c zainstalowanym pakiecie<\/li>\n<li>&#8222;przecie\u017c to ma\u0142a zmiana, to po co zmienia\u0107 wydanie&#8221; &#8211; troch\u0119 \u0142agodniejszy objaw &#8211; poprawka co prawda trafia do repozytorium, ale nie jest to odnotowywane w zmianie wersji czy wydania<\/li>\n<\/ul>\n<p>Problem mo\u017cna podsumowa\u0107 kr\u00f3tko &#8211; dokonywanie zmian w kodzie poza systemem kontroli wersji.<\/p>\n<h3>A po co mi te wszystkie bajery<\/h3>\n<p>Narz\u0119dzia do zarz\u0105dzania repozytorium dostarczaj\u0105 spor\u0105 liczb\u0119 mo\u017cliwo\u015bci u\u0142atwiaj\u0105cych \u017cycie. Wiele z nich jest tak prostych u\u017cyciu, \u017ce a\u017c szkoda ich nie stosowa\u0107. Jednym z takich u\u0142atwie\u0144 jest po porostu log. Miejsce w kt\u00f3rym mo\u017cna wpisa\u0107 dowoln\u0105 informacj\u0119, a w szczeg\u00f3lno\u015bci kr\u00f3tkie podsumowanie zmian kt\u00f3re s\u0105 wprowadzone w danym commicie.<\/p>\n<h2><em>Co zrobi\u0107<\/em><\/h2>\n<h3>Koncepcja zastosowania i u\u017cytkowania repozytorium<\/h3>\n<p>Przede wszystkim nale\u017cy zacz\u0105\u0107 od zastanowienia si\u0119 pod co nam to ca\u0142e repozytorium, do czego ma s\u0142u\u017cy\u0107, jak\u0105 warto\u015bci ma nam dostarczy\u0107. Na tej podstawie mo\u017cemy okre\u015bli\u0107<\/p>\n<ul>\n<li>struktur\u0119 repozytorium &#8211; bo dobre repozytorium ma przemy\u015blan\u0105 organizacj\u0119 katalog\u00f3w, g\u0142\u00f3wnego pnia, ga\u0142\u0119zi rozwojowych itd<\/li>\n<li>zasady wykorzystania repozytorium &#8211; czyli procedury post\u0119powania z repozytorium, regu\u0142y wg. kt\u00f3rych dzia\u0142amy, ograniczenia kt\u00f3rych nie mo\u017cna przekracza\u0107<\/li>\n<li>zarz\u0105dzanie konfiguracj\u0105 &#8211; okre\u015blenie tego nad czym pracujemy, jak b\u0119dziemy to co\u015b zmieniali i jak b\u0119dziemy post\u0119powali na styku przygotowywany produkt a otoczenie w jakim dzia\u0142a<\/li>\n<\/ul>\n<h3>U\u017cywaj prawid\u0142owo narz\u0119dzi i mo\u017cliwo\u015bci dostarczanych przez system<\/h3>\n<p>&#8230;lub te\u017c &#8222;1.0-SNAPSHOT is no more&#8221;.\u00a0 Systemy zarz\u0105dzania wersjami poza &#8222;zwyk\u0142ym&#8221; odk\u0142adaniem kolejnych wersji zapewnia tak\u017ce zbi\u00f3r innych narz\u0119dzi, kt\u00f3re maj\u0105 pom\u00f3c w prowadzeniu dewelopmentu.<\/p>\n<p>\u015awietnym przyk\u0142adem jest tutaj wstawiany z automatu w plikach <em>pom.xml<\/em> 1.0-SNAPSHOT jako oznaczenie wersji. Maven przy generowaniu pliku umieszcza taki zapis bo kto\u015b tak przyj\u0105\u0142 i nie ma tu nic z\u0142ego &#8211; cokolwiek innego nie r\u00f3\u017cni\u0142o by si\u0119 jako\u015bciowo od tego rozwi\u0105zania, jednak za\u0142o\u017ceniem jest, \u017ce to oznaczenie wersji powinno odzwierciedla\u0107 faktyczn\u0105 wersj\u0119 oprogramowania. Rzadko jednak mo\u017cna spotka\u0107 si\u0119 z faktyczn\u0105 aktualizacj\u0105 tej zmiennej. W efekcie, zespo\u0142y pracuj\u0105ce wersj\u0105 0.0.1 oprogramowania w <em>pom.xml <\/em>maj\u0105 dumnie wpisane 1.0. A wystarczy wykorzysta\u0107 tak\u0105 niewielk\u0105 funkcj\u0119 <strong>svn<\/strong>a jak podstawianie taga ($Revision$) w plikach, lub bardziej zaawansowany spos\u00f3b przy pomocy <em>hook script.<\/em><\/p>\n<p>Nie m\u00f3wi\u0105c o bardziej podstawowych funkcjach, takich jak narz\u0119dzia wspieraj\u0105ce kopiowanie, przenoszenie, usuwanie plik\u00f3w z kopii roboczej lub repozytorium z zachowaniem \u015bledzenia wersji.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O svn, systemach kontroli wersji i jak ich sensownie u\u017cywa\u0107 w bardziej z\u0142o\u017conych przypadkach.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[18,11,19],"class_list":["post-39","post","type-post","status-publish","format-standard","hentry","category-narzedzia","category-programowanie","tag-kontrola-wersji","tag-scm","tag-svn"],"_links":{"self":[{"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/posts\/39","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/comments?post=39"}],"version-history":[{"count":26,"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/posts\/39\/revisions"}],"predecessor-version":[{"id":125,"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/posts\/39\/revisions\/125"}],"wp:attachment":[{"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/media?parent=39"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/categories?post=39"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jaceksalacki.pl\/index.php\/wp-json\/wp\/v2\/tags?post=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}