Erfaringer med Mercurial som versionskontrolsystem
De sidste to år har jeg arbejdet meget med Mercurial som versionskontrolsystem, og jeg vil gerne dele mine erfaringer.
Dette er ikke et forsvar for Mercurial i forhold til nogle af de andre "konkurrenter", såsom Subversion og Git.
Nedenstående kræver nok at I har øjet en del af http://hgbook.red-bean.com/ igennem. Det er ikke alt, der skal være nemt at læse :-D
Du skal ikke være bekymret for at at dette blog-indlæg evt. skal ligge et par år for det er relevant. Hvis du allerede er i gang med at
bruge Mercurial, så er jeg meget interesseret i dine vurderinger nedenfor.
Mercurial er ret nemt at komme i gang med på en Linux/BSD-maskine. Har jeg et par filer, som skal udvikles af mig hen over et par timer, så lægger jeg dem i Mercurial
hg init hg add FIL1 FIL2 FIL3 hg commit -m "Tilføjede filerne"
og når jeg har lavet et par ændringer - f.eks. at koden oversætter - så laver jeg en version til.
hg commit -m "Ændring så det oversætter"
Den ekstra tid, jeg anvender på at sætte det op er så lille i forhold til de hjælp jeg har ved at kunne gå frem og tilbage i versionerne (med "hg update").
Fra tid til anden får jeg lavet noget kode, som "pludselig" er blevet værre. I det tilfælde er det guld at kunne gå tilbage,
Mercurial er smart ved at jeg kan lave lokal versionskontrol på et vilkårligt katalog uden at skulle have en systemadministrator med på vognen.
Mange brugere
En af de "let-negative" erfaringer med Mercurial er at hver bruger har en kopi af hele versions-historikken.
Derfor kan man let ende med at have ret store datamængder i ".hg" kataloget, som indeholder historikken.
Det er meget anderledes end f.eks. CVS, hvor hele versions-historikken kun ligger et sted i CVSROOT-kataloget.
Hvis jeg sammenligner CVS og Mercurial, så er noget af de der glæder mig mest opdateringshastigheden. Når jeg opdaterer i CVS til f.eks. et "tag", der ligger seks måneder tilbage, så koster det oftest 5-10 minutter for de større projekter jeg arbejder med. Det er dødens pølse....
Mercurial er lysår foran mht. opdateringshastighed - det tager for mine projekter et eller ganske få sekunder at opdatere til et ældre "tag".
Et reelt problem med Mercurial
Djævlen ligger i detaljen siger man, og et af de problemer med Mercurial, som jeg erfarede ret sent er man har valgt at man skal have committed alle sine ændrede filer før man kan merge.
Antag at brugerne Mads og Martin deler et projekt.
Martin: Redigerer FIL1 Mads: Redigerer FIL2 og FIL3 Martin: hg commit -m "Jeg har lappet et par fejl" FIL1; hg push Mads: hg commit -m "Jeg roder videre med FIL2" FIL2
Når Mads nu vil se hvad der er lavet af ændringer fra andre personer (her er det fra Martin), så kører Mads "hg pull", hvilket giver en advarsel om at Mads skal merge Martins ændring i FIL1 ind lokalt.
Det går også fint, hvis Mads faktisk er klar til at committe alle sine ændringer. Jeg har erfaret at det jævnligt IKKE er tilfældet. Jeg forstår ikke denne begrænsning i Mercurials design, men det er jævnligt irriterende.
Heldigvis har en af de dygtige Martin Geisler løst det problem ved at brugeren kan droppe sin commit og dermed undgå en merge, Løsningen er en af de mange gode "stackoverflow"-diskussioner: http://stackoverflow.com/questions/10156906/mercurial-undoing-two-or-more-commits
hg update "p1(min(outgoing()))" hg revert --all --rev tip hg strip "outgoing()" hg pull -u
Dette kræver at brugerne har dette tilføjet til ~/.hgrc
[extensions] mq =
Overblik
Jeg anvender meget "hg view" til at få overblik over historik. Det er basalt, men udmærket.
Jeg ville gerne have have gang i Tortoisehg, fordi det ser ud til at give godt overblik og rig mulighed for at arbejde grafisk med Mercurial.
Pt. driller afhængighederne mig vildt og inderligt på Red Hat 6.x. De Qt-biblioteker, som følger med Red Hat passer ikke sammen med Tortoisehg - fest. Det problem har jeg ikke sat skovlen ned i endnu.
Kommenter gerne nedenfor...
/pto
