Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
becki:linux:mercurial_tips [2011-09-30 09:49] becki |
becki:linux:mercurial_tips [2018-05-15 15:49] (aktuell) becki [Undoing Changes] |
||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| * [[svn tips]] --- [[git]] --- [[cvs tips]] | * [[svn tips]] --- [[git]] --- [[cvs tips]] | ||
| - | * ''hg'' lists basic commands, ''hg help'' lists all commands and ''hg help <command>'' shows the help for ''<command>'' | + | * ''hg'' lists basic commands, ''hg help'' lists all commands and ''hg help <command>'' shows the help for ''<command>'' |
| * Infos are scattered over [[hg>wiki/UnderstandingMercurial]], the [[hg>wiki/Tutorial]], the [[hg>guide|Workflow Guide]] and the [[hgbook>|Hgbook]] | * Infos are scattered over [[hg>wiki/UnderstandingMercurial]], the [[hg>wiki/Tutorial]], the [[hg>guide|Workflow Guide]] and the [[hgbook>|Hgbook]] | ||
| * [[http://code.google.com/p/support/wiki/DVCSAnalysis|Analysis of Git and Mercurial]] by Google | * [[http://code.google.com/p/support/wiki/DVCSAnalysis|Analysis of Git and Mercurial]] by Google | ||
| Zeile 27: | Zeile 27: | ||
| share/man/man5/hgrc.5 # not with 1.8 ? | share/man/man5/hgrc.5 # not with 1.8 ? | ||
| share/man/man5/hgignore.5 # not with 1.8 ? | share/man/man5/hgignore.5 # not with 1.8 ? | ||
| - | | + | |
| - | [[hg>wiki/UnixInstall|See also]] | + | [[hg>wiki/UnixInstall|See also]] |
| ===== Configuration == | ===== Configuration == | ||
| Zeile 39: | Zeile 39: | ||
| ; ~/.hgrc | ; ~/.hgrc | ||
| - | [extensions] | + | [extensions] |
| hgext.graphlog = | hgext.graphlog = | ||
| - | hgext.extdiff = | + | hgext.extdiff = |
| - | + | ||
| - | [extdiff] | + | [extdiff] |
| cmd.kdiff = kompare | cmd.kdiff = kompare | ||
| Zeile 105: | Zeile 105: | ||
| Bookmarks for often accessed remote repositories can be set in ''.hgrc''. Example: | Bookmarks for often accessed remote repositories can be set in ''.hgrc''. Example: | ||
| - | alias | + | alias |
| http://www.selenic.com/mercurial/hg.1.html#urls | http://www.selenic.com/mercurial/hg.1.html#urls | ||
| Zeile 122: | Zeile 122: | ||
| [[http://mercurial.selenic.com/wiki/QuickStart#Setting_up_a_new_Mercurial_project|Source]] | [[http://mercurial.selenic.com/wiki/QuickStart#Setting_up_a_new_Mercurial_project|Source]] | ||
| + | ==== Templates and Styles == | ||
| + | |||
| + | Log-like commands can be formatted with froatting strings, wich ar called templates. A style is simply a precanned template. Command to list all installed styles: | ||
| + | |||
| + | hg log --template list | ||
| + | |||
| + | Command to incluce phase info into the log: | ||
| + | |||
| + | hg glog --template phases | ||
| + | hg glog -T phases | ||
| ==== Converting Repo from CVS == | ==== Converting Repo from CVS == | ||
| Zeile 131: | Zeile 141: | ||
| ==== Branching == | ==== Branching == | ||
| - | See [[hg>wiki/TutorialClone|hg clone]] | + | Remommendation: Use internal branches, i.e. [[hg>wiki/Branch|hg branch]] and add a bookmark to each branch. Don't use [[hg>wiki/TutorialClone|hg clone]] or named branches for branching. |
| + | |||
| + | See alo http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ | ||
| + | |||
| - | (Note that there exists also a possibility for internal branches and merges.) | ||
| ==== Merging == | ==== Merging == | ||
| Zeile 144: | Zeile 157: | ||
| This section describes how to create e.g. client-specific variants of the same main project eg. for special needs of customers. | This section describes how to create e.g. client-specific variants of the same main project eg. for special needs of customers. | ||
| + | |||
| + | FIXME Use [[hg>wiki/RebaseExtension]] and fix rest of this section. | ||
| === "Separate what changes" Solution == | === "Separate what changes" Solution == | ||
| Zeile 194: | Zeile 209: | ||
| hg revert <file1> [<file2>] | hg revert <file1> [<file2>] | ||
| - | Restores the files in the working directory to the state when they had been last commited. Much more options are posssible, see ''hg help revert'' [[http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html#id391367|Hgbook]] [[http://mercurial.selenic.com/wiki/Revert|Wiki]] | + | Restores the files in the working directory to the state when they had been last commited. Much more options are posssible, see ''hg help revert'' [[http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html#id391367|Hgbook]] [[hg>wiki/Revert|Wiki]] |
| === Undo latest commit == | === Undo latest commit == | ||
| Zeile 202: | Zeile 217: | ||
| === Undo an older commit == | === Undo an older commit == | ||
| - | Use ''hg backout REV'' | + | Use ''hg backout REV''. The old commit is not deleted from history, but reverted as new commit |
| === Undo more commits than the latest == | === Undo more commits than the latest == | ||
| + | |||
| + | ''hg strip'' (can also be used to remove an older head) | ||
| + | |||
| + | Or: | ||
| Use ''clone -r <revnumber> <old> <new>'' to create a repo which contains only the changesets until <revnumber>. Than throw away the original repo and use the cloned repo. | Use ''clone -r <revnumber> <old> <new>'' to create a repo which contains only the changesets until <revnumber>. Than throw away the original repo and use the cloned repo. | ||
| + | |||
| + | === History editing == | ||
| + | |||
| + | ''hg histedit'' e.g. for merging serveral changesets into one. See [[hg>wiki/HisteditExtension|Wiki]] | ||
| + | |||
| + | Wrong histeds may be reverted by ''hg unbundle .hg/strip-backup/<backupfile>''. This works for wrong ''hg rebase''s as well. | ||
| + | ==== 'cherry-picking == | ||
| + | |||
| + | Copy changes from other branches onto the current branch: See [[hg>hg/help/graft]] | ||
| ==== Queues == | ==== Queues == | ||
| Zeile 214: | Zeile 242: | ||
| <code bash> | <code bash> | ||
| hg init --mq # Start / -c for version control / qinit is deprecated | hg init --mq # Start / -c for version control / qinit is deprecated | ||
| - | hg qnew name_of_patch # Create new patch | + | hg qnew -m 'message' name_of_patch # Create new patch |
| hg qrefresh # Update the patch with the new changes | hg qrefresh # Update the patch with the new changes | ||
| hg qapplied # Show currently pushed patches | hg qapplied # Show currently pushed patches | ||
| Zeile 229: | Zeile 257: | ||
| hg qpush -a # apply all patches to repo | hg qpush -a # apply all patches to repo | ||
| </code> | </code> | ||
| + | |||
| + | ===== Collaboration models == | ||
| + | |||
| + | Basically there is [[hgbook>collaborating-with-other-people.html#id372641|Pull-only versus shared-push]] collaboration. See also [[hg>wiki/WorkingPractices]] | ||
| ===== Publishing with Webserver == | ===== Publishing with Webserver == | ||
| + | |||
| + | Uncomment or add the following line to ''/etc/httpd/httpd.conf'': | ||
| + | LoadModule cgi_module lib/httpd/modules/mod_cgi.so | ||
| [[hg>wiki/PublishingRepositories|Source]] | [[hg>wiki/PublishingRepositories|Source]] | ||
| - | <code bash> | + | Create file ''/etc/mercurial/webrc''((name is arbitrary, but it must be mentioned in ''web.cgi'' below and it must not be ''hgrc'', because this is the global config file of mercurial)): |
| - | mkdir /etc/mercurial | + | |
| + | <code ini> | ||
| + | [collections] | ||
| + | /home/share/hgroot = /home/share/hgroot | ||
| + | |||
| + | [web] | ||
| + | allow_archive = gz, zip, bz2 | ||
| + | encoding = UTF-8 | ||
| </code> | </code> | ||
| - | Create ''/etc/mercurial/hgrc'': | + | Copy ''hgweb.cgi'' from root dir of the mercurial //source//((For Slack, you need to download the source, cause the cgi is missing in default install)) tarball to ''/var/www/cgi-bin/hgweb'' and correct the path to the ''webrc'' config file: |
| - | [web] | + | <code>7c7 |
| - | allow_archive = gz, bz2 | + | < config = "/path/to/repo/or/config" |
| + | --- | ||
| + | > config = "/etc/mercurial/webrc" | ||
| + | </code> | ||
| - | Create ''/etc/mercurial/hgwebrc'': | + | Clone some repositories into ''/home/share/hgroot'' and point browser to ''http://localhost/cgi-bin/hgweb/'' |
| - | [collections] | + | ===== Working with Git Repositories == |
| - | /home/share/hgroot = /home/share/hgroot | + | |
| - | Copy ''hgweb.cgi'' from root dir of mercurial tarball to ''/var/www/cgi-bin'', optionally rename it to ''hgweb'' and make the following edits: | + | With the [[hg>wiki/HgGit|HgGit]] extension you can push/pull to/from a remote (or local) Git repo while doing all the work in a local Hg repo. A nice way to get around Git commands :-) |
| - | <code> | + | See http://hg-git.github.io/ for more info. |
| - | @@ -4,10 +4,13 @@ | + | |
| - | # See also http://mercurial.selenic.com/wiki/PublishingRepositories | + | |
| - | + | ||
| - | # Path to repo or hgweb config to serve (see 'hg help hgweb') | + | |
| - | -config = "/path/to/repo/or/config" | + | |
| - | +config = "/etc/mercurial/hgwebrc" | + | |
| - | + | ||
| - | # Uncomment and adjust if Mercurial is not installed system-wide: | + | |
| - | -#import sys; sys.path.insert(0, "/path/to/python/lib") | + | |
| - | +import sys; sys.path.insert(0, "/usr/local/lib/python2.5/site-packages") | + | |
| - | + | + | |
| - | +import os | + | |
| - | +os.environ["HGENCODING"] = "UTF-8" | + | |
| - | + | ||
| - | # Uncomment to send python tracebacks to the browser if an error occurs: | + | |
| - | #import cgitb; cgitb.enable() | + | |
| - | </code> | + | |
| - | Clone some repositories into ''/home/share/hgroot'' and point browser to ''http://localhost/cgi-bin/hgweb/'' | + | ==== Install == |
| + | |||
| + | HgGit needs dulwich. Both is available on www.slackbuilds.org | ||
| + | |||
| + | ==== Working with HgGit == | ||
| + | |||
| + | Local repo (L) is hg, remote repo (R) is git. | ||
| + | We want to push/pull to/from branch master on R | ||
| + | |||
| + | FIXME Verify: | ||
| + | |||
| + | - L needs a (manually created) //bookmark// ''master'' which tells HgGit to push to / pull from which branch on R. Checkout if that bookmark must point to tip in order to get pushed all commits! Checkout if the bookmark must be active on L! | ||
| + | - The //tag// ''default/master'' is autmatically created and moved on L on every push to / pull from R | ||
| + | - In order to push from L to R, R must not be on the branch to which to L wants to push (see [[git#push]]) | ||
| + | |||
| + | See https://www.mercurial-scm.org/wiki/HgGit | ||
| + | ==== Access Github == | ||
| - | ===== Todo == | + | To push an existing Mercurial repository to Github: |
| + | - [[https://help.github.com/articles/generating-ssh-keys/|Import]] your public SSH key to Github | ||
| + | - [[https://help.github.com/articles/create-a-repo/|Create]] an empty repo, e.g. ''foo'' on Github | ||
| + | - Cd into your local Hg repo and do <code> | ||
| + | hg bookmark -r default master # make a bookmark of master for default, so a ref gets created | ||
| + | hg push git+ssh://git@github.com/becki/foo.git</code> | ||
| - | * Checkout the export/import feature: http://mercurial.selenic.com/wiki/TutorialExport | ||