Hits : 3335


Mercurial :: Mini How To 


Working Progress ... still :)
Προσπαθώ να καταγράψω το Mercurial 1.4


Mercurial


file:logomercurial.png


a fast, lightweight Source Control Management system designed for efficient handling of very large distributed projects.


Το λογισμικό mercurial είναι ένα πρόγραμμα για απομακρυσμένη διαχείριση κώδικα ανεξάρτητα με το λειτουργικό.


http://www.selenic.com/mercurial


Το βιβλίο του mercurial: http://hgbook.red-bean.com


Ενώ ένα πολύ ενδιαφέρον site for tips: hgtip


Data Sheets:

http://www.ivy.fr/mercurial/ref/v1.0
http://edong.net/2008v1/docs/dongwoo-Hg-300dpi.png


Παρουσίαση: google


Ένα υπέρ-αναλυτικό άρθρο για Version Control: http://www.infoq.com/articles/dvcs-guide


top


Installation


Requirement: Python 2.3.0 or later, Gnu Make


(Σε μία διανομή ubuntu χρειάζεται απλά το : apt-get install python2.5-dev)


$ wget -c http://mercurial.selenic.com/release/mercurial-1.4.tar.gz
$ tar zxvf mercurial-1.4.tar.gz
$ cd mercurial-1.4
$ make all
$ make install


Εναλλακτικά μπορούμε να κατεβάσουμε την τελευταία σταθερή έκδοση μέσω του mercurial
(εάν δλδ έχουμε παλαιότερη έκδοση) με τον εξής τρόπο:


$ hg clone http://selenic.com/repo/hg-stable mercurial.hg
$ cd mercurial.hg
$ make all
$ make install


Εάν θέλουμε να χρησιμοποιήσουμε την development έκδοση του mercurial τότε πρέπει να
κατεβάσουμε το εξής αντίγραφο:


$ hg clone http://selenic.com/repo/hg mercurial.hg


top


Extras


# cp contrib/bash_completion /etc/bash_completion.d/hg
# cp contrib/vim/HGAnnotate.vim /usr/share/vim/vim72/syntax/


top


Simple Usage


Το ακόλουθο κομμάτι κώδικα αποτελεί ένα πολύ απλό παράδειγμα χρήσης του mercurial.

  1. Παράγουμε έναν κλώνο. Δλδ κατεβάζουμε ένα πλήρη αντίγραφο ενός project.
  2. Ενημερωνόμαστε για τυχόν αλλαγές στον κώδικα.
  3. Εάν υπάρχουν αλλαγές πραγματοποιούμε αναβάθμιση στο αντίγραφο που διατηρούμε.

$ hg clone http://hg.dovecot.org/dovecot/
$ cd dovecot


Όποτε θέλουμε να ελέγξουμε για τυχόν αλλαγές στον κώδικο τότε απλά γράφουμε:


$ hg pull
pulling from http://hg.dovecot.org/dovecot/
searching for changes
no changes found
$ hg update
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

log 


$ hg log | head -11
changeset:   7493:45b79d3e393e
tag:         tip
user:        Matt Mackall <mpm@selenic.com>
date:        Sat Dec 20 16:12:01 2008 -0600
summary:     Added signature for changeset 3773e510d433

changeset:   7492:e9d21bbfd4cc
user:        Matt Mackall <mpm@selenic.com>
date:        Sat Dec 20 16:12:00 2008 -0600
summary:     Added tag 1.1.1 for changeset 3773e510d433

parents


$ hg parents
changeset:   7493:45b79d3e393e
tag:         tip
user:        Matt Mackall <mpm@selenic.com>
date:        Sat Dec 20 16:12:01 2008 -0600
summary:     Added signature for changeset 3773e510d433

Αναβάθμιση


$ hg pull
$ hg update

Status


$ hg status

Δημιουργία αρχειοθήκης


Από τον κατάλογο που έχουμε μπορούμε να δημιουργήσουμε archive files.
Οι τύποι μου υποστήριζονται είναι οι εξής:


  • files, Απλά ένας κατάλογος με αρχεία
  • tar, ασυμπίεστο αρχείο αρχειοθήκης
  • tbz2, bzip2 συμπιεσμένο αρχείο αρχειοθήκης
  • tgz, ((http://en.wikipedia.org/wiki/Gzip gzip) συμπιεσμένο αρχείο αρχειοθήκης
  • uzip, ασυμπίεστο αρχείο μορφής zip 
  • zip, zip συμπιεσμένο αρχείο

Ένα παράδειγμα:


$ hg archive -t tbz2 mercurial.tbz2

$ file mercurial.tbz2 
mercurial.tbz2: bzip2 compressed data, block size = 900k


branch


$ hg branche
default                     7493:45b79d3e393e

$ hg branches
default                     7493:45b79d3e393e

heads


$ hg heads
changeset:   7493:45b79d3e393e
tag:         tip
user:        Matt Mackall <mpm@selenic.com>
date:        Sat Dec 20 16:12:01 2008 -0600
summary:     Added signature for changeset 3773e510d433

identify


$ hg identify
45b79d3e393e tip

paths


$ hg paths
default = http://selenic.com/repo/hg-stable

resolve


$ hg resolve --all

root


$ hg root 
/home/ebal/mercurial.hg

show config


$ hg showconfig
bundle.mainreporoot=/home/ebal/dnl/sw/mercurial.hg
paths.default=http://selenic.com/repo/hg-stable

tags


Τα tags είναι ένας ευκολότερος και καλύτερος τρόπος για να διαχειριζόμαστε τις εκδόσεις αντί των revision numbers.
Μπορούμε να δούμε τα tags με την εξής εντολή:


$ hg tags | head 
tip                             7493:45b79d3e393e
1.1.1                           7491:3773e510d433
1.1                             7461:2a67430f92f1
1.0.2                           6514:d2375bbee6d4
1.0.1                           6457:d5cbbe2c49ce
1.0                             6386:bae2e9c838e9
0.9.5                           5472:23889160905a
0.9.4                           4723:fb4b6d5fe100
0.9.3                           3896:27230c29bfec
0.9.2                           3865:36a957364b1b


Σε δικό μας παράδειγμα μπορούμε να ορίσουμε ένα tag ως εξής:


$ hg tag -r 2 test

tip 


Το Tip είναι πάντα το τελευταίο changeset (είναι κάτι σαν tag για την τελευταία έκδοση)


$ hg tip
changeset:   7493:45b79d3e393e
tag:         tip
user:        Matt Mackall <mpm@selenic.com>
date:        Sat Dec 20 16:12:01 2008 -0600
summary:     Added signature for changeset 3773e510d433

verify


$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1117 files, 7494 changesets, 14713 total revisions

version


$ hg version
Mercurial Distributed SCM (version unknown)

Copyright (C) 2005-2008 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


top


Changes


See History or Change:

hg log


See Heads of Log

$ hg heads


Version:

hg version


Status:


hg status


Root:

hg root


top


Summary


Εμφανίζει μία συνοπτική κατάσταση του καταλόγου εργασίας mercurial.


Ορίστε ένα παράδειγμα (από το dovecot 1.2):


$ hg summary 
parent: 9484:fa8a438c64ce tip
 lib-index: MAIL_TRANSACTION_TYPE_MASK didn't contain the new _EXT_HDR_UPDATE32.
branch: HEAD
commit: (clean)
update: (current)


top


Web 


Μία από τις καλύτερες δυνατότητες του mercurial είναι ότι μπορεί να μας "σερβίρει" το περιεχόμενο
ενός version source directory μέσω http. Είναι εξαιρετικά εύκολο:


$ hg serve

127.0.0.1 - - [23/Dec/2008 21:55:52] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [23/Dec/2008 21:55:52] "GET /static/style-paper.css HTTP/1.1" 200 -
127.0.0.1 - - [23/Dec/2008 21:55:52] "GET /static/hglogo.png HTTP/1.1" 200 -
127.0.0.1 - - [23/Dec/2008 21:55:52] "GET /static/hgicon.png HTTP/1.1" 200 -
127.0.0.1 - - [23/Dec/2008 21:55:55] "GET /static/hgicon.png HTTP/1.1" 200 -


Ο python http server ακούει by default στην http port=8000.


Οπότε μπορούμε απλά με την χρήση ενός web client/browser (π.χ. firefox)
να ανοίξουμε την εξής διεύθυνση:


http://localhost:8000


top


Mercurial Help


Παρακάτω είναι οι τρόποι να για δούμε την βοήθεια και την επεξήγηση των εντολών του mercurial project


$ hg

$ hg -v

$ hg --help

$ man hg


και εάν θέλουμε βοήθεια για μία συγκεκριμένη εντολή:


$ hg help init

$ hg -v help init


και εάν θέλουμε ακόμα περισσότερη βοήθεια :


$ hg --debug help


top


List of commands


Η παρακάτω λίστα εντολών αποτελεί απλά ένα hg help
από την stable έκδοση του mercurial 0.9.5.


hg command
$ hg help
Mercurial Distributed SCM


list of commands:


annotateshow changeset information per file line
archivecreate unversioned archive of a repository revision
backoutreverse effect of earlier changeset
bisectsubdivision search of changesets
branchset or show the current branch name
brancheslist repository named branches
bundlecreate a changegroup file
catoutput the current or given revision of files
clonemake a copy of an existing repository
commitcommit the specified files or all outstanding changes
copymark files as copied for the next commit
diffdiff repository (or selected files)
exportdump the header and diffs for one or more changesets
grepsearch for a pattern in specified files and revisions
headsshow current repository heads or show branch heads
helpshow help for a given topic or a help overview
identifyidentify the working copy or specified revision
importimport an ordered set of patches
incomingshow new changesets found in source
initcreate a new repository in the given directory
locatelocate files matching specific patterns
logshow revision history of entire repository or files
manifestoutput the current or given revision of the project manifest
mergemerge working directory with another revision
outgoingshow changesets not found in destination
parentsshow the parents of the working dir or revision
pathsshow definition of symbolic path names
pullpull changes from the specified source
pushpush changes to the specified destination
recoverroll back an interrupted transaction
removeremove the specified files on the next commit
renamerename files; equivalent of copy + remove
resolveretry file merges from a merge or update
revertrestore individual files or dirs to an earlier state
rollbackroll back the last transaction
rootprint the root (top) of the current working dir 
serveexport the repository via HTTP
showconfigshow combined config settings from all hgrc files
statusshow changed files in the working directory
tagadd one or more tags for the current or given revision
tagslist repository tags
tipshow the tip revision
unbundleapply one or more changegroup files
updateupdate working directory
verifyverify the integrity of the repository
versionoutput version and copyright information

additional help topics:


datesDate Formats
patternsFile Name Patterns
environmentEnvironment Variables
revisionsSpecifying Single Revisions
multirevsSpecifying Multiple Revisions
diffsDiff Formats

top


Mercurial in Action

Βασικές Λειτουργίες


Ο παρακάτω κώδικας αποτελεί ένα τυπικό παράδειγμα χρήσης του mercurial.
Γίνεται επεξήγηση μέσω παραδείγματος των παρακάτω βασικών λειτουργιών:


  • init
  • add 
  • commit
  • annotate
  • log 
  • heads
  • status
  • manifest
  • rollback
  • revert
  • clone
  • pull
  • push
  • merge
  • update
  • version

Το παρακάτω παράδειγμα λειτουργίας παρουσιάζεται γραφικά στο κάτω μέρος της σελίδας αυτής.
Για λόγους ευχρηστίας έχω αριθμήσει τα βήματα.


top


Παράδειγμα Κώδικα


file:hg01.jpg


############################################################
## Hg Init – Add – Commit – Rollback – Revert – Status – log ############################################################
 
$ hg version
Mercurial Distributed SCM (version 0.9.5)
 
Copyright © 2005-2007 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
$ cd /tmp
$ mkdir -pv 0
mkdir: created directory `0'
$ cd 0/
$ ls -a
.  ..
$ hg init
$ ls -a
.  ..  .hg
$ cat > hello.py <<EOF
> #! /usr/bin/python
> print "Hello World"
> EOF
$ chmod u+x hello.py 
$ ./hello.py 
Hello World
$ hg add
adding hello.py
$ hg status
A hello.py
$ hg commit -u ebal -m 'Initial Checkout'
$ hg log
changeset:   0:c972c6b85200
tag:         tip user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ echo "print 30+10" >> hello.py
$ ./hello.py
Hello World
40
$ hg log
changeset:   0:c972c6b85200
tag:         tip user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg st
M hello.py
$ hg commit -u ebal -m '30+10'
 
$ hg annotate hello.py
0: #!/usr/bin/python
0: print "Hello World"
1: print 30+10
 
$ hg log
changeset:   1:55b1aefad4c6
tag:         tip user:        ebal
date:        Fri Dec 28 14:21:16 2007 +0200
summary:     30+10
 
changeset:   0:c972c6b85200
user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg heads
changeset:   1:55b1aefad4c6
tag:         tip user:        ebal
date:        Fri Dec 28 14:21:16 2007 +0200
summary:     30+10
 
$ hg manifest
hello.py
 
$ hg rollback
rolling back last transaction
$ hg log
changeset:   0:c972c6b85200
tag:         tip user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg st
M hello.py
$ hg revert hello.py
reverting hello.py
 
$ hg log
changeset:   0:c972c6b85200
tag:         tip user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ ./hello.py
Hello World
 
############################################################
## Hg Clone – Push – Pull – Merge – Update
############################################################
 
$ cd ..
$ hg clone 0 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
$ hg clone 0 2
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
$ cd 1/
$ echo "print 20+20" >> hello.py 
$ ./hello.py
Hello World
40
$ hg log
changeset:   0:c972c6b85200
tag:         tip user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg st
M hello.py
$ hg ci -u ebal -m '20+20'
$ hg log
changeset:   1:37024d736aae
tag:         tip user:        ebal
date:        Fri Dec 28 14:22:38 2007 +0200
summary:     20+20
 
changeset:   0:c972c6b85200
user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg push
pushing to /tmp/0
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
 
$ cd ../2/
$ echo "print 30+30" >> hello.py 
$ ./hello.py 
Hello World
60
$ hg log
changeset:   0:c972c6b85200
tag:         tip user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg st
M hello.py
$ hg ci -u ebal -m '30+30'
$ hg log
changeset:   1:7ae88d5f15d1
tag:         tip user:        ebal
date:        Fri Dec 28 14:23:02 2007 +0200
summary:     30+30
 
changeset:   0:c972c6b85200
user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg pull
pulling from /tmp/hello
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)
 
$ hg merge
merging hello.py
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -u ebal -m 'merge commit'
$ hg log
changeset:   3:262581d0c679
tag:         tip parent:      2:37024d736aae
parent:      1:7ae88d5f15d1
user:        ebal
date:        Fri Dec 28 14:25:23 2007 +0200
summary:     merge commit
 
changeset:   2:37024d736aae
parent:      0:c972c6b85200
user:        ebal
date:        Fri Dec 28 14:22:38 2007 +0200
summary:     20+20
 
changeset:   1:7ae88d5f15d1
user:        ebal
date:        Fri Dec 28 14:23:02 2007 +0200
summary:     30+30
 
changeset:   0:c972c6b85200
user:        ebal
date:        Fri Dec 28 14:20:29 2007 +0200
summary:     Initial Checkout
 
$ hg st
? hello.py.tmp.
$ ./hello.py
Hello World
60
40
$ hg push
pushing to /tmp/0
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files
 
$ cd ../1/
$ hg pull
pulling from /tmp/0
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files
(run 'hg update' to get a working copy)
$ hg up
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ ./hello.py 
Hello World
60
40

top


Γραφική απεικόνηση βασικής λειτουργίας


file:hg02.png


top



hgrc


vim ~/.hgrc


[ui]
username = Evaggelos Balaskas <ebalaskas@ebalaskas.gr>
verbose = True

[extensions]
hgext.graphlog = 

[extensions]
hgext.extdiff =

[extdiff]
cmd.meld = meld
opts.meld =