{"id":73,"date":"2008-10-21T15:27:54","date_gmt":"2008-10-21T14:27:54","guid":{"rendered":"http:\/\/www.hinnerup.net\/?p=73"},"modified":"2008-10-21T15:30:00","modified_gmt":"2008-10-21T14:30:00","slug":"skab-overblik-ved-merge-af-branches-i-cvs","status":"publish","type":"post","link":"https:\/\/www.hinnerup.net\/en\/permanent\/2008\/10\/21\/skab-overblik-ved-merge-af-branches-i-cvs\/","title":{"rendered":"Skab overblik f\u00f8r merge af branches i CVS"},"content":{"rendered":"<p>Anvendelse af versioneringssystemer af den ene eller anden art er med meget f\u00e5 undtagelser en god id\u00e9 &#8211; hvad enten man arbejder som eneste udvikler p\u00e5 et projekt, er flere der altid arbejder p\u00e5 HEAD af et projekt eller i en af f\u00f8rn\u00e6vnte konfigurationer har behov for at arbejde i flere branches af et projekt samtidig.<\/p>\n<p>Der opst\u00e5r imidlertid potentielt komplicerede situationer, n\u00e5r udviklingen p\u00e5 to eller flere branches p\u00e5 et tidspunkt skal flettes sammen og den resulterende kode enten idrifts\u00e6ttes eller benyttes som basis for fortsat udvikling: Der kan v\u00e6re sket \u00e6ndringer i rigtig mange filer, ved mange forskellige mennesker h\u00e6nder, i sammenh\u00e6ng med vidt forskellige projekter og opgaver.<\/p>\n<p>Det kan i den anledning v\u00e6re med til at skabe ro omkring processen, ved inden gennemf\u00f8relse af fletning, at identificere hvilke filer der er \u00e6ndret p\u00e5 flere branches &#8211; og kombinere denne oplysning med hvilke brugere der har v\u00e6ret involveret i de givne \u00e6ndringer, s\u00e5ledes at disse p\u00e5 forh\u00e5nd kan foreberede sig p\u00e5 at h\u00e5ndtere eventuelle konflikter, og efterf\u00f8lgende at v\u00e6re med til at bekr\u00e6fte hvorvidt deres respektive \u00e6ndringer ogs\u00e5 fungerer efter endt fletning.<\/p>\n<p>Imidlertid er de data CVS kan levere ikke umiddelbart nemme at overskue. Heldigvis kan de med lidt assitance fra Excel relativt nemt beriges og behandles i en pivottabel, s\u00e5 det ogs\u00e5 for en personkreds med relativt lille kendskab til versionsstyringssystemer forekommer overskueligt, hvor stor en opgave der forest\u00e5r ved et kommende merge.<\/p>\n<p><code>cvs history -c -a -p yourRepositoryName >yourRepositoryName.txt<\/code><\/p>\n<p>Ovenst\u00e5ende vil tr\u00e6kke de informationer ud der er behov for, i form af fommits for alle brugere for et givent repository &#8211; og aflevere dem i en tekstfil i et format, der nemt kan importeres i Excel.<\/p>\n<p><a href=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/exceltextimportwizard.png\" style=\"float: right;\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/exceltextimportwizard-150x150.png\" alt=\"\" title=\"Excel - Text Import Wizard\" width=\"150\" height=\"150\" class=\"alignright size-thumbnail wp-image-77\" \/><\/a>Ved import af filen genereret af CVS, vil Text Import Wizard med overvejende sandsynlighed tr\u00e6ffe alle de rette valg. S\u00e5ledes kan der blot kan v\u00e6lges &#8220;Finish&#8221;, n\u00e5r dialogen dukker op ved \u00e5bning af filen.<\/p>\n<p>Principielt burde cvs history kunne tage argumenter p\u00e5 formen  &#8220;-D 2008-01-01&#8221;, og derved kun returnere informationer fra d\u00e9n dato og frem &#8211; imidlertid viser praktiske erfaringer, at det kan v\u00e6re s\u00e6rdeles vanskeligt at fremprovokere denne opf\u00f8rsel i praksis. N\u00e5r dette er tilf\u00e6ldet, er det n\u00f8dvendigt &#8211; og i hvert fald ofte hensigtsm\u00e6ssigt &#8211; at frasortere data der ligger f\u00f8r de branches der er interessante. Dette kan g\u00f8res ved at v\u00e6lge alt, sortere efter kolonne B (Commit Date) og slutteligt at markere og slette de r\u00e6kker der ligger f\u00f8r d\u00e9n.<\/p>\n<p>Ved inds\u00e6ttelse af en r\u00e6kke i toppen af arket, anbefales f\u00f8lgende navngivning af kolonnerne:<\/p>\n<ul>\n<li>Action<\/li>\n<li>Commit Date<\/li>\n<li>Commit Time<\/li>\n<li>Unknown<\/li>\n<li>Username<\/li>\n<li>Revision<\/li>\n<li>Filename<\/li>\n<li>Path<\/li>\n<li>Equals<\/li>\n<li>Client<\/li>\n<\/ul>\n<p>Med henblik p\u00e5 den videre behandling, inds\u00e6ttes umiddelbart efter kolonnen &#8220;Revision&#8221; en kolonne der navngives &#8220;Branch&#8221;. Ved kopiering beregnes v\u00e6rdien for samtlige r\u00e6kke i den efter formlen:<\/p>\n<p>Engelsk Excel: <code>=IF(ISNUMBER(SEARCH(\".\";RIGHT(F2;2);1));LEFT(F2;LEN(F2)-1);LEFT(F2;LEN(F2)-2))<\/code><\/p>\n<p>Dansk Excel: <code>=HVIS(ER.TAL(FIND(\".\";H\u00d8JRE(F2;2);1));VENSTRE(F2;L\u00c6NGDE(F2)-1);VENSTRE(F2;L\u00c6NGDE(F2)-2))<\/code><\/p>\n<p>V\u00e6r opm\u00e6rksom p\u00e5, at ovenst\u00e5ende formler ikke tager h\u00f8jde for revisioner h\u00f8jere end 99!<\/p>\n<p><a style=\"float: left; margin-right: 1em;\" href=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/excelcreatepivottable.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/excelcreatepivottable-150x150.png\" alt=\"\" title=\"Excel - Create PivotTable\" width=\"150\" height=\"150\" class=\"alignleft size-thumbnail wp-image-88\" \/><\/a>Formlen benytter sig af det faktum, at alt andet en det sidste ciffer i versionsnummeret i CVS angiver en branch, og fungerer ved gennem tekstuel manipulation at fjerne dette.<\/p>\n<p><a style=\"float: right; margin-left: 1em;\" href=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/excelpivottablefieldlist.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/excelpivottablefieldlist-140x300.png\" alt=\"\" title=\"Excel - Pivottable Fieldlist\" width=\"140\" height=\"300\" class=\"alignright size-medium wp-image-108\" \/><\/a>Hele arket kan derefter markeres, og guiden til inds\u00e6ttelse af en pivottabel kan kaldes.<\/p>\n<p>Her tr\u00e6kkes felterne &#8220;Path&#8221;, &#8220;Filename&#8221; og &#8220;Branch&#8221; til &#8220;Row Labels&#8221;, feltet &#8220;Username&#8221; til &#8220;Column Labels&#8221; og feltet &#8220;Action&#8221; til &#8220;Values&#8221;.<\/p>\n<p>Derved vil genereres et ark, der lister hver filnavn under det eller de branches den indg\u00e5r i, med angivelse af hvilken bruger der har lavet rettelser i hvert branch. Filerne der er interessante i forbindelse med et merge vi v\u00e6re nemme at finde, idet disse vil indg\u00e5 i flere branches, og dermed have to eller flere linier over filnavnet.<\/p>\n<p><a style=\"display: block; text-align: center;\" href=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/excelbranchpivottable.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.hinnerup.net\/wp-content\/uploads\/2008\/10\/excelbranchpivottable-300x67.png\" alt=\"\" title=\"Excel - Branch PivotTable\" width=\"300\" height=\"67\" class=\"aligncenter size-medium wp-image-96\" \/><\/a><\/p>\n<p>Hermed en efterlysning af andre potentielt interessante efterbehandlingsmetoder og m\u00e5l, baseret p\u00e5 data trukket ud af CVS.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Anvendelse af versioneringssystemer af den ene eller anden art er med meget f\u00e5 undtagelser en god id\u00e9 &#8211; hvad enten man arbejder som eneste udvikler p\u00e5 et projekt, er flere der altid arbejder p\u00e5 HEAD af et projekt eller i en af f\u00f8rn\u00e6vnte konfigurationer har behov for at arbejde i flere branches af et projekt [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[18,14,15,17,16,19],"class_list":["post-73","post","type-post","status-publish","format-standard","hentry","category-cvs-versionsstyring","tag-branch","tag-cvs","tag-excel","tag-merge","tag-pivot","tag-projektstyring"],"_links":{"self":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/73","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/comments?post=73"}],"version-history":[{"count":45,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/73\/revisions"}],"predecessor-version":[{"id":126,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/73\/revisions\/126"}],"wp:attachment":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/media?parent=73"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/categories?post=73"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/tags?post=73"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}