2017 m. lapkričio 12 d., sekmadienis

Mercurial SCM

Akronimai


  • SCM (source code management) - išeities kodo valdymo sistema.
  • RC (revision control) - revizijų kontrolės sistema.
  • VCS (version control systems) - versijų kontrolės sistema.
  • DVCS (distributed VCS) - paskirstyta VCS.

Kas yra SCM
  • Vieta saugoti išeities tekstą.
  • Istoriniai pakeitimų įrašai.
  • Priemonė komandiniam darbui.
SCM raida
  • make įrankis (1970)
  • Bell labs aprašė diff algoritmą (1972)
  • CDC update įrankis (1970. Apima revizijų kontrolės, pakeitimų rinkinių, PĮ versijos sukūrimo valdymo ir failų skirtumų funkcionalumą)
  • SCCS source code control system (1972)
  • CCC version control system (1975)
  • RCS revision control system (1980)
  • patch utility (around 1988)
  • CVS Concurrent Version System (1986), CVSNT (1998)
  • Subversion (1999)

Paskirstytos SCM:
  • BitKeeper (1999)
  • GNU Arch (2001)
  • Monotone (2003)
  • darcs (2003)
  • git (2005)
  • Mercurial (2005)
  • Bazzar (2005)
Komercinės SCM:
  • ClearCase (1992)
  • VSS (1994)
  • Perforce (1995)
  • Vault (2002)
  • AccuRev (2002)
  • TFS (2005)
SCM sistemų klasifikacija

  • Centralizuota (kliento-serverio modelis):
    • Subversion
    • CVS
    • VSS, TFS, Vault
    • ClearCase
    • AccuRev
  • Paskirstyta (distributed):
    • Git
    • Mercurial
    • Bazzar
    • Perforce
    • BitKeeper

Pagrindinės sąvokos
  • Repozitorija (angl. repository)
  • Pakeitimų rinkinys (angl. change set)
  • Darbinis katalogas (angl. working directory)
Repozitorija

  • Repozitorija yra katalogas saugantis projekto istoriją. Nėra įmantrios duomenų bazės ar papildomos aparatinės įrangos.
  • Repozitorijos kopijos pagaminimas (“clone”) yra nebrangi operacija.
  • Yra visur pasiekiama, nes kiekvienas naudotojas dirba su savo repozitorija.
Kas laikoma repozitorijoje?

  • Pakeitimų įrašas (angl. changelog) - repozitorijos pasikeitimų istorija.
  • Manifestas - kiekvieną pakeitimo rinkinį apimančių bylų versijų istorija.
  • Bylos duomenys - repozitorijos stebimų bylų pasikeitimų istorija.

Pakeitimų rinkinys
  • Konkretaus laiko pakeitimų momentinė kopija (angl.snapshot)
  • Jis saugo sekančią informaciją:
    • Pakeitimo autoriaus varda.
    • Pakeitimo aprašymą.
    • Kurios bylos keitėsi ir kokie pakeitimai atlikti.
    • Pakeitimų rinkinio identifikatorių (angl. change set ID).
    • Ankstesnio pakeitimų rinkinio informaciją.
  • Pakeitimų rinkinį sukuria “commit” komanda.


Darbinis katalogas

  • Repozitorijos vaizdas po konkretaus pakeitimų rinkinio. Pakeitimų rinkinys yra darbinio katalogo tėvas (angl.parent).
  • Suteikia galimybę keisti bet kurią bylą darbiniame kataloge:
  • Mano pakeitimai pateks į sekantį pakeitimų rinkinį.
  • Bylos gali būti pridėtos, pašalintos, pervadintos arperkopijuotos.
  • Suteikia galimybę matyti einamuosius pakeitimus.
Mercurial apžvalga

Mercurial instaliavimas

Debian šeimos Linux operacinėje sistemoje Mercurial galima instaliuoti atp programų valdymo įrankio pagalba:

$ sudo apt-get install mercurial

hg sąvokos - revizija

Priklausomai nuo konteksto revizija turi dvi prasmes:
  • Dažniausiai revizija nurodo konkretų pakeitimų rinkinį, esanti repozitorijoje. Pavyzdžiui nurodant lokalų revizijos numerį -r arba --rev parametru “hg update” ar “hg merge” komandoje.
  • Dar terminas revizija yra naudojamas kaip sutrumpinta termino “bylos revizija” forma, kuri nurodo tam tikrą repozitorijoje saugomos bylos versiją.

Kiekviena revizija turi:
  • unikalų 40 skaitmenų revizijos identifikatorių (pvz. :ae06f1...),
  • sutrumpinta revizijos identifikatoriaus formą (3:ae06....), kuri yra pilno ID prefiksas,
  • lokalų revizijos numerį (3:ae06f11c79f7), kuris yra mažas, sveikas skaičius. Tusčios repozitorijos revizijos numeris yra -1.
  • Nutolusios repozitorijos revizijų identifikavimui naudojamas pilnas ID.
  • Lokalios repozitorijos revizijų identifikavimui patogu naudoti revizijos numerį.

hg id - revizijos identifikatorius

Parodyti revizijos numerį:
$ hg id -n
3

Parodyti trumpą revizijos identifikatoriaus formą:
$ hg id -i
ai06f11c89f7

Parodyti pilną revizijos identifikatorių:
$ hg --debug id -i
ye451c79f70724245c4f31b833b7a760a4ed

Revizijos duomenų pavyzdys


Parodyti “tip” revizijos informaciją:
$ hg tip
changeset: 3:ae06f11c79f7
tag: tip
parent: 1:7a84f8e3af88
parent: 2:f26eb327976c
user: someDev1
date: Tue Oct 07 11:53:50 2014 +0300
summary: some comment after merge

hg sąvokos - “head”
  • Head yra pakeitimų rinkinys, kuris neturi vaikų (angl. child) pakeitimų rinkinių.
  • Tip yra paskutinis pakeistas “head”, pavyzdžiui atlikus “commit” arba “pull” komandą.
  • Jei repozitorijoje yra keletas “head”, tai tik vienas iš jų bus “tip”.
  • Repozitorijoje pakeitimų rinkiniai yra numeruojami nuosekliai, todėl “tip” turės didžiausią numerį.
  • Žodis “tip” veikia kaip speciali žyme (angl. tag), nurodanti “tip” pakeitimų rinkinį (pvz. hg tip).
hg sąvokos - šaka

  • Šaka (angl. branch) atsiranda, kai PĮ kūrimo linija išsiskiria.
  • Šaka turi tėvo (angl. parent) ir nemažiau kaip du vaikų pakeitimo rinkinius.
  • Kai dvi PĮ kūrimo linijos apjungiamos į vieną yra sakoma, kad įvyko sujungimas (angl. merge). Sujungimas turi du tėvo pakeitimų rinkinius.
  • Kol šakos dar nėra apjungtos, paskutinis šakos pakeitimų rinkinys yra vadinamas šakos “head”.

hg sąvokos - žymė

Žymė (angl. tag) yra simbolinis pasikeitimų rinkinio identifikatorius. Hg turi dviejų
rušių žymes:
  • lokalią - patogumui skirta žymė, kurios nekontroliuoja revizija ir kuri neperduodama su kitais pakeitimais. Ji saugoma .hg/localtags repozitorijos byloje.
  • Įprasta - kontroliuojama revizijos ir perduodama kartu su kitais pakeitimais. Ji saugoma .hg/tags repozitorijos faile.

Naudojimas:
hg tags
hg tag [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...

Trumpas bazinių hg komandų gidas

Sukurti repozitoriją hg init myrepo
Pasirinkti repozitoriją cd myrepo
Sukurti bylą gedit myfile
Pridėti blylą įrašymui hg add myfile
Peržiūrėti pasikeitimus hg status

File has been added A myfile
Įrašyti pasikeitimus hg commit


hg init

Sukuria naują, tusčią repozitoriją.

Naudojimas:
hg init [-e CMD] [--remotecmd CMD] [DEST]

hg status

Parodo skirtumą tarp darbinio katalogo ir einamosios revizijos.

Bylos pažymimos kaip:
  • modified(M) - pakeistos.
  • added(A) - pridėtos.
  • removed(R) - pašalintos.
  • missing(!) - trūkstamos.
  • unknown(?) - neatpažintos.

Naudojimas:
hg status [OPTION]... [FILE]...

hg add

Pažymi naujas bylas įrašymui su sekančia “commit” komanda.

Naudojimas:
hg add [OPTION]... [FILE]...

Blylų pažymejimą galima panaikinti hg forget komanda:
hg forget [OPTION]... FILE...


hg remove

Pažymi trukstamas / ištrintas bylas pašalinimui su sekančia “commit” komanda. Parametras -A / --after nurodo pažymeti pašalinimui tik trukstamas bylas.


Naudojimas:
hg remove [OPTION]... FILE...
Bylų pažymejimą pašalinimui galima panaikinti hg revert komanda.

hg addremove

Pažymi naujas bylas pridėjimui ir trukstamas / išštrintas bylas
pašalinimui su sekančia “commit” komanda.

Naudojimas:
hg addremove [OPTION]... [FILE]...

hg commit

Sukuria naują reviziją.
Revizija saugo “commit” komandos metu buvusią repozitorijos pasikeitimų būseną.
 “commit” yra lokali operacija ir pakeitimai nėra matomi kitiems kol nebus pasidalinti (angl. share).
 Įvykdžius “commit” komandą, “status” neberodys pakeitimų.
Rekomenduojama nurodyti komentarą (hg commit -m "<JIRA-TICKET> pakeitimų aprašymas").

Naudojimas:
hg commit [OPTION]... [FILE]...

hg revert

Atstato darbinio katalogo bylas į pradinę būseną.
Pakeistos bylos išsaugomos su .orig priesaga. Atsarginių kopijų (angl. backups) sukūrimą galima išjungti naudojant --no-backup opciją.

Naudojimas:
hg revert [OPTION]... [-r REV] [NAME]...

hg update

  • Leidžia pasirinkti bet kurią reviziją.
  • Keičiant revizija pesikeičia “einamoji revizija” ir darbinio katalogo bylos taip, kad atitiktų pasirinkos revizijos būseną.

Naudojimas:
hg update [-c] [-C] [-d DATE] [[-r] REV]

hg branch
  • Sukuria naują šaką, pagal nurodytą vardą.
  • Jei šakos vardas nenurodomas tai hg šakai priskiria vardą “default”.
  • Šakų vardas yra nekeičiamas ir yra “commit” operacijos meta-duomenų dalis.
  • Šaka pasirenkama naudojant hg update komandą.
  • Šaka pažymima kaip uždaryta naudojant hg commit --close-branch komandą.

Naudojimas:
hg branch [-fC] [NAME]


hg merge

Sujungia darbinio katalogo tėvo revizija su pasirinkta revizija ir jos patampa darbinio katalogo tevais.
“merge” atliekama sujungiant abiejų revizijų pakeitimus, panaudojus jų bendrą ankstesnę revizija.
Jei “merge” operacijos metu įvyko konfliktas, jis turi būti išspręstas.
“merge” nesukuria naujos revizijos.
Sujungti pakeitimai įrašomi naudojant “commit” komandą.
Neįrašytus sujungimo pakeitimus galimą atšaukti naudojant “hg update --clean” komanda.

Naudojimas:
hg merge [-P] [-f] [[-r] REV]


hg diff
  • Parodo nurodytų failų skirtumus tarp skirtingų revizijų.
  • Skirtumai rodomi vieningu “diff” formatu.

Naudojimas:
hg diff [OPTION]... ([-c REV] | [-r REV1 [-r REV2]])[FILE]...


hg diff - pavyzdziai

Palyginti darbinio katalogo bylą su tėvo revizija:
hg diff foo.c

Palyginti dvi istorines katalogo versijas:
hg diff -r 1.0:1.2 lib/

Gauti pakeitimo statistika pagal paskutinio pakeitimo datą:
hg diff --stat -r "date('may 2')"

Palyginti naujai pridėtas bylas kurios turi nurodyta raktinį žodį:
hg diff "set:added() and grep(GNU)"

Palyginti revizija su jos tevo revizija:
hg diff -c 9353 # palyginti su pirmu tevu
hg diff -r 9353^:9353 # tas pats naudojant revizijos sintakse
hg diff -r 9353^2:9353 # palyginti su antru tėvu

hg export

  • Atspausdina pakeitimų rinkinio antraštę ir skirtumus “diff” formatu vienai ar keletai revizijų.
  • Jei revizija nenurodyta, tai naudojamas darbinio katalogo tėvo pakeitimų rinkinys.
  • Antraštėje rodoma sekanti pakeitimų rinkinio informacija: autorius, data, šakos vardas (jei ne “default” šaka), pakeitimų rinkinio identifikatorius, tevų revizijos ir “commit” komentaras.

Naudojimas:
hg export [OPTION]... [-o OUTFILESPEC] [-r] [REV]...

hg export - pavyzdziai

Eksportavimo ir importavimo panaudojimas klaidos pataisymo perkėlimui į einamąją šaką:
hg export -r 9353 | hg import -

Eksportuoti pakeitimų rinkinius, esančius tarp dviejų revizijų, į nurodytą bylą:
hg export -r 123:150 > changes.txt

Skaidyti išeinančius pakeitimus į pakeitimų eilę su aprašomais bylų vardais:
hg export -r "outgoing()" -o "%n-%m.patch"


hg import

Importuoja pataisymų (angl. patch) sąrašą ir įrašo (“commit”)
juos individualiai jei nėra nurodyta --no-commit opcija.
Kadangi importavimas taikomas darbiniam katalogui, tai einamieji, neišsaugoti pakeitimai bus panaikinti.

Naudojimas:
hg import [OPTION]... PATCH...


hg import - pavyzdžiai

Importuoti įprastini pataisymą iš žiniatinklio puslapio:
hg import -s 80 http://example.com/bugfix.patch

Importuoti pataisymą iš hg žiniatinklio puslapio pagal revizijos numerį:
hg import http://www.selenic.com/hg/rev/5ca8c111e9aa

Bandymas tiksliai atstatyti eksportuota pataisymą (ne visada galimas):
hg import --exact proposed-fix.patch


hg log

Parodo revizijų istoriją visai repozitorijai arba pasirinktai bylai.

Naudojimas:
hg log [OPTION]... [FILE]

hg log - pavyzdžiai 1

Revizijų istoriją suformatuoja į ASCII simbolių grafą:
hg log -G

Pakeitimai su pilnais aprašymais ir bylų sąrašais:
hg log -v

Visi darbinio katalogo pakeitimai:
hg log -f

Paskutiniai 10 einamosios šakos “commit”:
hg log -l 10 -b

Visi pakeitimai nurodytai bylai, įtraukiant ir bylos ištrinimą:
hg log --removed file.c

Visi nurodyto katalogo pakeitimai su “diff” informacija, bet be “merge” informacijos:
hg log -Mp lib/

Gražinti tik revizijų numerius tiems pakeitimų rinkiniams, kurie atitiko paiešką pagal raktažodį:
hg log -k bug --template "{rev}\n"

check if a given changeset is included is a tagged release:
hg log -r "a21ccf and ancestor(1.9)"

Rasti pakeitimus pagal naudotojo vardą ir datos rėžį:
hg log -k alice -d "may 2008 to jul 2008"

Apibendrinimas visų pakeitimų po paskutinės žymės (angl. tag):
hg log -r "last(tagged())::" --template "{desc|firstline}\n"


Kitos naudingos hg komandos

  • hg parents - atspausdina darbinio katalogo “parent” revizijas.
  • hg identify - atspausdina repozitorijos būsenos apibendrinimą naudojant vieną ar du "parent" revizijų identifikatorius.
  • hg summary - sugeneruoja trumpą darbinio katalogo būsenos apibendirnimą, įtraukiant “parent” revizijas, šakas, “commit” buseną ir galimus atnaujinimus.

Komandinis darbas

Kartu dirbanti komanda turi turėti galimybe dalintis atliktu darbu. Mercurial turi tris pagrindines dalinimosi komandas:
  • clone
  • pull
  • push

Pastaba. Rekomenduotina susikurti šaką naudotojo pakeitimų realizavimui. Pakeitimų įrašymas (“commit”) į šaką, padės išvengti atlikto darbo praradimų, jei kitas naudotojas išsaugos savo pakeitimus anksčiau, o naudotojas padarys pakeitimų apjungimo (“merge”) klaidą.


Dalinimosi hg komandų gidas

Išsaugoti pakeitimus 
hg commit

Perkelti mano pakeitimus 
hg push
abort: unsynced remote changes! Hg tells me I need to merge first

Pasiimti pakeitimus 
hg pull

Suvienodinti pakeitimus
hg merge

Išsaugoti suvienodinimą 
hg commit

Perkelti mano ir suvienodinimo pakeitimus
hg push
added 2 changesets with 2 changes
to 2 files

hg clone

  • Sukuria egzistuojančios repozitorijos kopiją
  • Repozitorija gali būti nutolusi arba lokali
  • Galima įsivaizduoti kaip sekančiu hg komandų rinkinį:
    • Sukurti repozitoriją (hg init)
    • Pasiimti revizijas iš šaltinio repozitorijos (hg pull)
    • Pasirinkti einamają reviziją (hg update)

Naudojimas:
hg clone [OPTION]... SOURCE [DEST]


hg clone - pavyzdžiai

Klonuoti nutolusią repozitoriją į kataloga vardu hg/:
hg clone http://selenic.com/hg

Lokalios repozitorijos klonavimas:
hg clone project/ project-feature/

Klonuoti naudojant absoliutų kelia esanti ssh serveryje:
hg clone ssh://user@server//home/projects/alpha/

Klonuoti repozitorija be pasikeitimų rinkinių, esančių prieš nurodytą revizija:
hg clone -r 04e544 experimental/ good/

Klonuoti pasirinktą šaką:
hg clone http://selenic.com/hg#stable

hg pull

Perkelia pasikeitimų revizijas iš nutolusios repozitorijos į lokalią repozitoriją.

hg incoming yra neišsauganti pakeitimų (angl. dry run) “pull” komandos versija.

Naudojimas:
hg pull [-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]

hg push

Perkelia pakeitimų revizijas, kurių nėra nutolusioje repozitorijoje, iš lokalios repozitorijos.
Nutolusi repozitorija gali būti ir lokaliame kompiuteryje

hg outgoing - yra neišsauganti pakeitimų “push” komandos versiją.
hg push --new-branch - perkelia į nutolusią repozitoriją lokaliai sukurtas šakas.

Naudojimas:
hg push [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]


Komentarų nėra:

Rašyti komentarą

Etiketės