Mercurial für Anfänger: Der endgültige praktische Leitfaden

237

Inspiriert von Git für Anfänger: Der endgültige praktische Leitfaden .

Dies ist eine Zusammenstellung von Informationen zur Verwendung von Mercurial für Anfänger für den praktischen Gebrauch.

Anfänger - ein Programmierer, der die Quellcodeverwaltung berührt hat, ohne sie sehr gut zu verstehen.

Praktisch - für Situationen, auf die die meisten Benutzer häufig stoßen - Erstellen eines Repositorys, Verzweigen, Zusammenführen, Ziehen / Verschieben von / zu einem Remote-Repository usw.

Anmerkungen :

  • Erklären Sie, wie etwas erledigt werden kann, anstatt wie etwas implementiert wird.
  • Beschäftige dich mit einer Frage pro Antwort.
  • Antworte klar und so präzise wie möglich.
  • Bearbeiten / erweitern Sie eine vorhandene Antwort, anstatt eine neue Antwort zum selben Thema zu erstellen.
  • Bitte geben Sie einen Link zum Mercurial-Wiki oder zum HG-Buch für Personen an, die mehr erfahren möchten.

Fragen:

Installation / Einrichtung

Mit dem Code arbeiten

Tagging, Verzweigung, Releases, Baselines

Andere

Andere Mercurial Referenzen

Laz
quelle

Antworten:

16

Wie konfiguriere ich es, um Dateien zu ignorieren?

Ignorieren wird in einer normalen Textdatei mit dem Namen .hgignore im Stammverzeichnis Ihres Repositorys konfiguriert. Fügen Sie es wie eine normale Datei hinzu mit:

hg add .hgignore

Für den Dateiangleich stehen zwei Syntaxoptionen zur Verfügung: glob und regexp. glob ist eine Unix-ähnliche Dateinamenerweiterung und reguläre Ausdrücke sind reguläre Ausdrücke. Sie aktivieren jedes durch Hinzufügen syntax: globoder syntax: regexpin einer eigenen Zeile. Alle folgenden Zeilen verwenden diese Syntax bis zur nächsten Syntaxmarkierung. Sie können so viele Syntaxmarkierungen haben, wie Sie möchten. Die Standardsyntax ist regulärer Ausdruck. Wenn Sie also nur regulären Ausdruck verwenden, benötigen Sie keinen Syntaxmarker.

Sie können Kommentare mit # hinzufügen

Beispiel:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Ignorieren gilt nur für nicht verwaltete Dateien (dh Dateien, die noch nicht eingecheckt sind). Um Dateien zu ignorieren, die der Versionskontrolle unterliegen, können Sie die Schalter -I und -X verwenden.

Joakim Lundborg
quelle
7
Es kann nützlich sein zu erwähnen, dass hg addMercurial Dateien nachverfolgt , wenn Sie sie manuell ignorieren. Zum Beispiel, wenn Sie eine Reihe von Dateien , wie haben deploy-test.conf, deploy-production.confetc und wollen nicht auf die Version sie (sie könnten Passwörter in ihnen haben) , aber sie tun möchten Version deploy-template.confSie einfach ignorieren können deploy*und manuell hinzufügen deploy-templace.conf.
Steve Losh
7

Wie sehen Sie, was nicht festgeschrieben ist oder welchen Status Ihre aktuelle Codebasis hat?

So zeigen Sie eine Liste der geänderten Dateien an:

$ hg status

Dadurch wird jede geänderte Datei zusammen mit ihrem Status gedruckt. Dies kann Folgendes umfassen:

  • M- Geändert. Die Datei wurde geändert und die Änderungen wurden nicht festgeschrieben.
  • A- Hinzugefügt. Die Datei wurde zuvor noch nicht verfolgt. Wenn Sie jedoch ein Commit ausführen, beginnt Mercurial mit der Verfolgung.
  • R- Entfernt. Die Datei wurde zuvor nachverfolgt. Wenn Sie jedoch ein Commit ausführen, wird Mercurial das Tracking in diesem und zukünftigen Commits einstellen.
  • ?- Unbekannt. Die Datei wird derzeit nicht von Mercurial verfolgt. Das Festschreiben hat keine Auswirkung darauf, es sei denn, Sie hg addfügen es hinzu.
  • !- Vermisst. Die Datei wurde verfolgt, aber Mercurial kann sie in der Arbeitskopie nicht finden.

So zeigen Sie die Änderungen an, die tatsächlich an den Dateien vorgenommen wurden:

$ hg diff
Steve Losh
quelle
6

Wie erstellen Sie ein neues Projekt / Repository?

$ hg init my-repository

quelle
5

Wie kann ich mit Subversion kommunizieren?

Es gibt drei Möglichkeiten:


Die Konvertierungserweiterung klont ein vorhandenes Subversion-Repository in ein Mercurial-Repository. Es kommt mit Mercurial. Es funktioniert ungefähr so:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

Dies greift beispielsweise nach dem Trunk des zwischengespeicherten SixApart-Repositorys.

hg convert http://code.sixapart.com/svn/memcached/trunk

Die Erweiterung kann schrittweise neue Revisionen aus einem Subversion-Repository in das Mercurial-Repository einfügen (ein bisschen wie Pull). Es wird jedoch nicht unterstützt, Mercurial-Revisionen zu übernehmen und an Subversion zurückzusenden (kein Push). [XXX: Korrigieren Sie dies, wenn es falsch ist] .


Die hgsubversion-Erweiterung . Es ist in vielerlei Hinsicht die fortschrittlichste Lösung, da es die Subversion-API verwendet, um mit dem Subversion-Repository zu kommunizieren. Es soll die hg-svn-Brücke werden. Es ermöglicht das vollständige Auslösen von Revisionen (vollständiges Klonen, Ziehen und Drücken). Zum jetzigen Zeitpunkt [XXX: Ändern Sie dies, wenn / wenn es falsch wird] befindet es sich jedoch noch in der Entwicklung und es gibt noch keine offiziellen Veröffentlichungen. Infolgedessen funktioniert es nur mit dem aktuellsten Mercurial (1.3 zum jetzigen Zeitpunkt).

  • Es ordnet Tags und Zweige zu (vor allen Tags tags/, um sie von gleichnamigen Zweigen zu unterscheiden).
  • Es unterhält einen speziellen Zweig closed-brancheszum Schließen von Zweigen, die in Subversion entfernt werden.
  • Es erfordert, dass das Subversion-Repository gemäß der Konvention von Trunk / Branches / Tags angelegt wird.
  • Der Befehlssatz hg svn <subcommand>zielt normalerweise darauf ab, so weit integriert zu werden, dass Sie den 'svn'-Teil nicht mehr benötigen (dh er möchte einen Subversion-Klon so weit wie möglich wie jedes andere Mercurial-Repository behandeln).;

Es funktioniert so:

Klon:

hg svnclone <Subversion URL> 

ODER (nur für svn://URLs)

hg clone <svn:// URL>

ziehen:

hg svn pull

drücken:

hg svn push

eingehend:

hg svn incoming

ausgehend:

hg svn outgoing

Auschecken eines gesamten Repositorys:

hg svnclone http://code.sixapart.com/svn/memcached

Das hgsvn Dienstprogramm ( bitbucket Baum ). Bis vor kurzem konnten Sie damit nur ein Subversion-Repository klonen und abrufen, aber ab hgsvn 0.1.7diesem Zeitpunkt wird Push unterstützt. [Ich weiß nicht, wie gut es pusht. Jeder mit mehr Erfahrung sollte dies aktualisieren.] Es hat die folgenden bemerkenswerten Funktionen:

  • Es generiert ein Mercurial-Tag für jedes SVN-Tag.
  • Es fügt jedem Änderungssatz ein lokales Tag hinzu, um seine SVN-Revision zu markieren.
  • Jede Mercurial-Revision wird einem benannten Zweig zugewiesen, der nach seinem SVN-Zweig benannt ist. Zum Beispiel branches/some-featurewäre wie hg branch some-feature. Der Trunk trunkwird aktiviert (dh es befindet sich nichts im Mercurial-Standardzweig, es sei denn, der Benutzer wechselt explizit zu diesem.)
  • Es wird versucht, Zweige und Tags zu identifizieren und zu erstellen, aber wenn dies nicht möglich ist, werden sie einfach übersprungen. Dies ist praktisch, wenn das Subversion-Repository nicht dem herkömmlichen Layout für Amtsleitungen / Zweige / Tags folgt.

Es funktioniert so:

Klon:

hgimportsvn <Subversion URL>

ziehen:

hgpullsvn

drücken:

hgpushsvn

eingehend:

hgpullsvn -n

ausgehend:

hgpushsvn -n

Auschecken eines gesamten Repositorys:

hgimportsvn http://code.sixapart.com/svn/memcached

Nur den Kofferraum auschecken:

hgimportsvn http://code.sixapart.com/svn/memcached/trunk
Quark
quelle
2
Ich habe es gerade benutzt hg convertund es dauert wirklich lange, wenn Sie ein SVN-Repository mit vielen Commits haben. Das Einrichten eines lokalen Repositorys mit svnsynchilft sehr, die Dinge zu beschleunigen - insbesondere, wenn Sie dies mehrmals tun müssen, weil Sie in Ihrem Konvertierungsbefehl einige falsche Optionen hatten.
Debilski
Ich denke, all diese Methoden sind schneller, wenn Sie eine lokale Kopie des SVN-Repositorys haben. Aber Sie können nicht immer das vollständige Repository erreichen, oder? Ich dachte, es svnsyncmuss auf die tatsächlichen Dateien des Repositorys zugegriffen werden, nicht nur auf die URL.
Quark
Bitte beachten Sie, dass sich hgsvn jetzt im Wartungsmodus befindet und daher nicht mehr aktiv entwickelt wird. Sie empfehlen stattdessen die Verwendung von hgsubversion.
Jon L.
5

Wie vergleichen Sie zwei Revisionen einer Datei oder Ihre aktuelle Datei und eine vorherige Revision?

Beide verwenden hg diff. Bei hg diffVerwendung werden alle Änderungen in der Arbeitskopie und im Tipp (das letzte Commit) angezeigt.

Für "Wie vergleichen Sie zwei Revisionen einer Datei?"

$ hg diff -r{rev1} -r{rev2} {file.code}

Der obige Befehl zeigt Unterschiede zwischen rev1 und rev2 von "file.code".

Für "Wie vergleichen Sie Ihre aktuelle Datei mit einer früheren Revision?"

$ hg diff {file.code}

Der obige Befehl unterscheidet sich zwischen der aktuellen Version von "file.code" und der letzten Revision (der zuletzt festgeschriebenen).

: D.

NawaMan
quelle
4

Wie können Sie einen bestimmten Satz von Revisionen für einen bestimmten Satz von Dateien markieren, freigeben oder freigeben, damit Sie diesen später jederzeit abrufen können?

$ hg tag my-tag

Sie können Ihr Repository auch klonen, um ein spezielles Tag- Repository zu erstellen .

$ hg clone working-repository my-tag-repository

quelle
3
Warum nicht hg tag my-tag?
Steve Losh
4

Wie verzweigen Sie?

$ hg branch my-branch

oder

$ hg klone original-repository my-branch

Es sollte jedoch beachtet werden, dass der Zweig ein "virtuelles" Verzeichnis erstellt (dh die Dateien bleiben gleich, aber hg behandelt sie so, als wären sie innerhalb des Systems unterschiedlich), während der Klon eine tatsächliche, vollständige Kopie erstellt. Genau genommen verzweigt sich der Klon nicht.

Nick Hodges
quelle
4
Dies ist die Schwergewichtsmethode, mit der sich Git-Leute immer über Mercurial-Leute lustig machen, wenn sie sie empfehlen. Ein leichter, vertrauterer Weg für Anfänger wärehg branch my-branch
Steve Losh
8
Sie müssen beachten, dass dies zwei völlig unterschiedliche Operationen sind.
stepancheg
2
Ich fand diesen Leitfaden, der für die Verzweigung in Mercurial hilfreich sein könnte: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard
Für leichte Zweige in hg, die nicht permanent sind (wie der hg-Zweig), verwenden Sie die Erweiterung mercurial bookmarks
hultqvist
Der von GoodEnough verlinkte Artikel bietet eine weitere einfache Methode mit Lesezeichen. Scheint ziemlich gut für Änderungen, die nicht
wichtig
4

Gutes GUI / IDE Plugin für Mercurial?

GUI

  • TortoiseHg für nahezu jedes Betriebssystem. Beinhaltet die Windows Explorer-Integration. Es funktioniert auch unter Linux und einigen anderen Betriebssystemen, einschließlich Max OS X. Es hat eine etwas klobige Oberfläche und ist anfangs etwas umständlich zu verwenden, aber es ist sehr vollständig und leistungsstark.
  • Murky läuft unter Mac OS X 10.5 oder höher. Murky eignet sich gut zum Erkunden des Repositorys und der grundlegenden Befehle, aber Sie müssen auch wissen, wie Sie die Befehlszeile verwenden.
  • MacHg ist eine nette Mac OS X- Benutzeroberfläche , die etwas mehr Funktionalität und Glanz als Murky bietet, aber Sie werden auch weiterhin die Befehlszeile benötigen.
  • SourceTree ist ursprünglich ein Mac-Client. Eine Windows-Version ist erst kürzlich verfügbar. Ziemlich schöne Benutzeroberfläche (zumindest unter OS X), unterstützt die meisten Hg-Funktionen, einschließlich Shelve.

Plugins

Macke
quelle
3

Wie legen Sie Änderungen fest?

Rufen Sie diesen Befehl aus dem aktuellen lokalen * mercurial-Repository auf

hg commit [OPTION]... [FILE]...

Aliase: ci

  • Ein lokales Quecksilber-Repository hat .hg im aktuellen Verzeichnis

Wo Option sein kann:

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

Ein Beispielbefehl wäre:

hg commit -m "added readme" README

ANMERKUNGEN :

  • Wenn eine Liste von Dateien weggelassen wird, werden alle vom "hg status" gemeldeten Änderungen festgeschrieben.
  • Wenn Sie das Ergebnis einer Zusammenführung festschreiben, geben Sie keine Dateinamen oder -I / -X-Filter an.
  • Wenn keine Festschreibungsnachricht angegeben ist, wird der konfigurierte Editor gestartet, um Sie zur Eingabe einer Nachricht aufzufordern.
jpartogi
quelle
3

Wie richte ich Mercurial ein?

Mercurial speichert seine Konfigurationsinformationen ~/.hgrcauf * nix-Systemen und %UserProfile%\mercurial.iniauf Windows-Systemen. ( %UserProfile%Ist normalerweise "C:\Documents and Settings\[username]\"auf Windows 2000- oder Windows XP-Systemen und normalerweise C:\Users\[username]\auf Windows Vista- und Windows 7-Systemen.)

Als Ausgangspunkt sollten Sie Ihren Mercurial-Benutzernamen festlegen, indem Sie Folgendes in Ihr .hgrcoder einfügen mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <[email protected]>

TortoiseHg-Benutzer auf Windows-Systemen können alternativ ausgeführt werden hgtk userconfig

Siehe auch " Erstellen einer Mercurial-Konfigurationsdatei " in Kapitel 2 von " Mercurial: The Definitive Guide ".

las3rjock
quelle
3

Wie verschmelzen Sie Zweige?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary
Martin Geisler
quelle
Als neuer Mercurial-Benutzer und als jemand, der neu in der Quell-Revisionskontrolle im Allgemeinen ist, verstehe ich diese Antwort nicht wirklich. Könnten Sie Ihren Beitrag klarstellen und erweitern? Ich verstehe immer noch nicht ganz, wie man den Befehl zum Zusammenführen verwendet.
Jamin Gray
3

Wie installiere ich Mercurial?

Bitte bearbeiten Sie es gut, wenn Sie es unter Linux von der Quelle installiert oder die Windows-Installationsprogramme verwendet haben.

Mac OS X 10.4 (Tiger), 10.5 (Leopard)

Verwenden Sie Pythons easy_install (mit Setuptools ):

sudo easy_install mercurial

Dies findet die neueste Version (1.3.1 zum Zeitpunkt des Schreibens) und wird installiert unter:

/Library/Frameworks/Python.framework/Versions/2.6/bin/

Mit Python 2.6 umgeht dies auch das Mercurial OS X-Installationspaket (Stand 1.2.1, Stand 26. Juli 2009) und beschwert sich, dass Python 2.5 benötigt wird. Aus der Dokumentation geht hervor , dass Fink und Macports Version 1.2 installieren.

Linux

Die meisten expliziten Linux-Pakete scheinen hinter der aktuellen Version zurückzubleiben. Verwenden Sie also easy_install (wie oben) oder laden Sie den Mercurial-Tarball herunter , extrahieren Sie das Archiv, wechseln Sie in das mercurial-Verzeichnis und führen Sie Folgendes aus:

$ make
$ sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

(aus Einführung von Mercurial, einem verteilten Versionskontrollsystem )

Windows

Es gibt ein Binärpaket der neuesten Version von Mercurial . TortoiseHg ist eine Windows-Shell-Erweiterung für Mercurial und installiert Mercurial. Cygwin kann auch Mercurial installieren.

Alternativ (Anweisungen zu lang, daher hier verlinkt) können Sie eine optimierte oder reine Python- Version von Mercurial aus dem Quellcode erstellen .

Dave Everitt
quelle
1
Um Quecksilber aus dem Quellcode zu erstellen, benötigt man die Python-Header. Installieren Sie python-dev oder python-devel für Benutzer paketorientierter Distributionen.
Nicolas Dumazet
3

Wie bekommt man den neuesten Code?

Mercurial merkt sich, woher ein Repository geklont wurde (in .hg / hgrc), sodass Sie einfach Folgendes ausführen können:

hg pull

um den neuesten Code aus dem Ursprungs-Repository zu ziehen. (Dadurch wird das Arbeitsverzeichnis nicht aktualisiert.)

hg update

um das Arbeitsverzeichnis zu aktualisieren.

hg pull -u

um gleichzeitig einen Pull und ein Update durchzuführen.

Laz
quelle
1
Der Ursprung wird aufgezeichnet, .hg/hgrcwenn Sie einen Klon erstellen, sodass Sie ihn beim Ziehen / Drücken nicht angeben müssen. Sie können dem [paths]Abschnitt in weitere Pfade hinzufügen, .hg/hgrcwenn Sie möchten.
Martin Geisler
3

Wie checkt man Code aus?

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

Wo Option sein kann:

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

Dabei ist Quelle die Quelle der Originaldateien im Repository, wobei es sich um eine Remote- URL oder ein Dateisystemverzeichnis handeln kann. Beispielsweise:

Am Zielort befindet sich der Quellcode in Ihrem lokalen Dateisystem.

jpartogi
quelle
1

Wie legen Sie Änderungen fest?

$ hg commit -m "Commit message"
NawaMan
quelle
1

Wie sehen Sie, welche Änderungen beim Push an das Upstream-Repository gesendet werden?

Verwenden Sie hg outgoingdiese Option, um die Liste der Änderungssätze abzurufen, die auf das Standard-Repository festgelegt werden:

$ hg outgoing

Verwenden Sie -p( --patch), um die tatsächlichen Codeänderungen abzurufen . Dadurch wird jeder Änderungssatz vollständig ausgegeben:

$ hg outgoing -p
Robotadam
quelle
1

Wie entferne ich eine Datei aus dem Repository?

So entfernen Sie eine Datei aus dem Repository und lassen sie beim nächsten Commit löschen:

$ hg remove {file(s)}

So entfernen Sie eine Datei aus dem Repository, lassen sie jedoch nicht löschen

$ hg remove -Af {file(s)}

oder aus Mercurial 1.3

$ hg forget {file(s)}
David Sykes
quelle
1

Wie kehren Sie zu einer früheren Version des Codes zurück?

Aus dieser Frage

$ hg update [-r REV]

@van: Wenn Sie später ein Commit durchführen, erstellen Sie effektiv einen neuen Zweig. Dann können Sie möglicherweise nur an diesem Zweig weiterarbeiten oder den vorhandenen Zweig zusammenführen.

David Sykes
quelle
1

Wie kann ein Änderungssatz zurückgesetzt werden?

Einige Optionen verfügbar

Easy Way (Zurücksetzen eines einzelnen Änderungssatzes)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

Hard Way (manuell unterscheiden und anwenden)

Schritt 1 : Erstellen Sie eine Patch-Datei, um die Änderungen zwischen Version 107 und 108 rückgängig zu machen:

hg diff -r107 -r108 --reverse  > revert-change.patch

(alternativ macht hg diff -r108 -r107 ohne --reverse dasselbe)

Schritt 2 : Wenden Sie die Patch-Datei an:

patch -p1 < revert-change.patch

Einige der Unterschiede können möglicherweise nicht zutreffen, zum Beispiel:

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

Die .rej-Datei enthält den Inhalt des Diff, der nicht angewendet werden konnte. Sie müssen einen Blick darauf werfen.

slf
quelle
1
Ist das nicht was dafür hg backoutist?
Wim Coenen
Ja, hg backout unterstützt jedoch nur eine einzige Änderungssatz-ID für backout. Auf jeden Fall sollte erwähnt werden, ich werde entsprechend aktualisieren
slf
1

Wie sehen Sie den Verlauf von Revisionen einer Datei oder eines Repositorys?

Anzeigen des Versionsverlaufs des gesamten Repositorys oder der gesamten Dateien

$ hg log {file(s)}

oder

$ hg history {file(s)}

Und um die Liste in umgekehrter Reihenfolge zu sehen

$ hg log -r:
David Sykes
quelle
1

Wie verschmelzen Sie Teile eines Zweigs mit einem anderen Zweig?

Aktivieren Sie die Transplantationserweiterung in Ihrer .hg / hgrc

[extensions]
transplant=

Laden Sie den Zielzweig und transplantieren Sie die Zielrevision.
Beispiel: Cherry Pick Revision 81 vom Zweig 'foo' in den aktuellen Zweig

$ hg transplant -b foo 81
John Mee
quelle
Neuere Versionen von Mercurial benötigen keine Transplantaterweiterung. Sie können den integrierten graftBefehl verwenden, um dasselbe zu tun. hg help graftFür weitere Informationen
DOOManiac
1

Wie extrahiert man einen Patch aus einem bestimmten Änderungssatz?

$ hg export -o patchfile changeset

Sie können dies dann in einen anderen Zweig importieren mit:

$ hg import patchfile
David Sykes
quelle