Yeni Başlayanlar için Mercurial: Kesin Pratik Kılavuz


237

Git'ten yeni başlayanlar için ilham alındı : Kesin pratik kılavuz .

Bu, pratik kullanım için yeni başlayanlar için Mercurial kullanımı hakkında bir bilgi derlemesidir .

Başlangıç ​​- Kaynak kontrolünü çok iyi anlamadan dokunan bir programcı.

Pratik - kullanıcıların çoğunun sıklıkla karşılaştığı durumları kapsayan - bir depo oluşturma, dallanma, birleştirme, uzak bir depodan / uzak depodan / depoya itme vb.

Notlar :

  • Bir şeyin nasıl uygulandığından ziyade bir şeyin nasıl yapılacağını açıklayın.
  • Her cevap için bir soru ile ilgilenin.
  • Mümkün olduğunca açık ve kısaca cevap verin.
  • Aynı konuda yeni bir yanıt oluşturmak yerine mevcut bir yanıtı düzenleyin / genişletin.
  • Daha fazla bilgi edinmek isteyen kişiler için lütfen Mercurial wiki veya HG Kitabına bir bağlantı sağlayın .

Sorular:

Kurulum / Ayarlar

Kod ile çalışma

Etiketleme, dallanma, bültenler, taban çizgileri

Diğer

Diğer Mercurial referansları

Yanıtlar:


16

Dosyaları yoksaymak için nasıl yapılandırırsınız?

Yoksay, deponuzun kökünde .hgignore adlı normal bir metin dosyasında yapılandırılır. Aşağıdaki gibi normal bir dosya gibi ekleyin:

hg add .hgignore

Dosya eşleme için iki sözdizimi seçeneği vardır: glob ve regexp. glob unix benzeri dosya adı genişletmesi ve regexp düzenli ifadelerdir. Her birini ekleyerek syntax: globveya syntax: regexpbir satırda tek başına etkinleştirirsiniz . Bunu izleyen tüm satırlar, bir sonraki sözdizimi işaretine kadar sözdizimini kullanır. İstediğiniz kadar sözdizimi işaretine sahip olabilirsiniz. Varsayılan sözdizimi regexp'dir, bu nedenle yalnızca regexp kullanıyorsanız herhangi bir sözdizimi işaretçisine ihtiyacınız yoktur.

# İle yorum ekleyebilirsiniz

Misal:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Yoksay yalnızca yönetilmeyen dosyalar için geçerlidir (yani önceden teslim edilmemiş dosyalar). Sürüm kontrolü altındaki dosyaları yok saymak için -I ve -X anahtarlarını kullanabilirsiniz.


7
hg addDosyaları manuel olarak göz ardı ederseniz Mercurial'ın dosyaları izleyeceğini belirtmek yararlı olabilir . Eğer gibi dosyaların bir grup var Örneğin, deploy-test.conf, deploy-production.confvb yapması ve yapmaması (kendilerinde şifreleri olabilir) sürüm onları istiyor ama bunu sürümü istediğiniz deploy-template.confsadece göz ardı edebilirsiniz deploy*ve elle ekleyebilir deploy-templace.conf.
Steve Losh

7

Tahakkuk etmeyenleri veya mevcut kod tabanınızın durumunu nasıl görüyorsunuz?

Değiştirilmiş dosyaların bir listesini görmek için:

$ hg status

Bu, değiştirilen her dosyayı, durumuyla birlikte aşağıdakileri içerecek şekilde yazdıracaktır:

  • M- Değiştirilmiş. Dosya değiştirildi ve değişiklikler yapılmadı.
  • A- Katma. Dosya daha önce izlenmedi, ancak Mercurial'ı taahhüt ederseniz dosyayı izlemeye başlayacak.
  • R- Kaldırıldı. Dosya daha önce izlendi, ancak taahhüt ederseniz Mercurial bu ve gelecekteki taahhütlerde dosyayı izlemeyi bırakacaktır.
  • ?- Bilinmeyen. Dosya şu anda Mercurial tarafından izlenmiyor. hg addEklemek için kullanmadığınız sürece taahhütte bulunmanın etkisi olmayacaktır .
  • !- Eksik. Dosya izlendi, ancak Mercurial dosyayı çalışan kopyada bulamıyor.

Gerçekte dosyalarda yapılan değişiklikleri görmek için:

$ hg diff

6

Nasıl yeni bir proje / havuz yaratırsınız?

$ hg init my-repository

5

Subversion ile nasıl arayüz oluştururum?

Üç yol vardır:


Dönüştürme uzantısı Mercurial birine varolan arşivinizi klonlamak edecektir. Mercurial ile birlikte gelir. Kabaca şu şekilde çalışır:

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

Örneğin bu, SixApart memcached deposunun bagajını kaplar.

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

Uzantı, bir Subversion deposundan Mercurial olana (biraz benzer bir şekilde) yeni revizyonlar getirebilir. Bununla birlikte, Mercurial revizyonların alınmasını ve Subversion'a geri gönderilmesini desteklemez (itme yok). [XXX: Yanlışsa bunu düzeltin] .


Hgsubversion uzantısı . Subversion veri havuzuyla iletişim kurmak için Subversion API'sını kullandığından birçok yönden en gelişmiş çözümdür. Bu olmayı hedeflemektedir hg-svn köprü. Revizyonların tam olarak açılmasına izin verir (tam klon, çekme ve itme), Ancak bu yazıdan itibaren [XXX: Yanlış olduğunda / yanlış olduğunda bunu değiştirin] hala geliştirilme aşamasındadır ve henüz resmi sürümler yoktur. Sonuç olarak, sadece en güncel Mercurial ile çalışır (bu yazının itibarı ile 1.3).

  • Etiketleri ve dalları eşleştirir ( tags/eşdeğer olarak adlandırılmış dallardan ayırt etmek için tüm etiketlerden önce ).
  • closed-branchesSubversion'da kaldırılan şubeleri kapatmak için özel bir şubeye sahiptir.
  • Bu gerektiren Subversion gövde / dallar / etiketlerin konvansiyona göre yerleştirilebilir deposundan söyledi.
  • Komut kümesi tipik olarak hg svn <subcommand>'svn' kısmına ihtiyacınız olmayan noktaya entegre olmayı amaçlamaktadır (diğer bir Mercurial deposu gibi olabildiğince bir Subversion klonuna işlemek istemektedir);

Şöyle çalışır:

klon:

hg svnclone <Subversion URL> 

VEYA (yalnızca svn://URL'ler için)

hg clone <svn:// URL>

Çek:

hg svn pull

it:

hg svn push

gelen:

hg svn incoming

dışa dönük:

hg svn outgoing

Bir deponun tamamını kontrol etme:

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

Hgsvn programı ( bitbucket ağacı ). Yakın zamana kadar bu sadece bir Subversion deposunu klonlamanızı ve çekmenizi sağlar, ancak hgsvn 0.1.7itme işlemini destekler. [Ne kadar iyi ittiğini bilmiyorum . Daha fazla deneyimi olan herkes bunu güncellemelidir.] Aşağıdaki önemli özelliklere sahiptir:

  • Her SVN etiketi için bir Mercurial etiketi oluşturur.
  • SVN revizyonunu işaretlemek için her değişiklik kümesine yerel bir etiket koyar .
  • Her Mercurial revizyonunu SVN şubesinden sonra adlandırılmış bir şubeye koyar. Mesela branches/some-featureşöyle olurdu hg branch some-feature. Bagajı devreye sokar trunk(kullanıcı açıkça ayarlanmadıkça Mercurial varsayılan dalında hiçbir şey yoktur.)
  • Dalları ve etiketleri tanımlamaya ve oluşturmaya çalışır, ancak yapamazsa sadece atlar. Bu, Subversion deposu geleneksel ana hat / dallar / etiketler düzenini takip etmediğinde kullanışlıdır.

Şöyle çalışır:

klon:

hgimportsvn <Subversion URL>

Çek:

hgpullsvn

it:

hgpushsvn

gelen:

hgpullsvn -n

dışa dönük:

hgpushsvn -n

Bir deponun tamamını kontrol etme:

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

Sadece bagajı kontrol etmek:

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

2
Ben sadece kullandım hg convertve birçok taahhüt ile bir svn deposu olduğunda gerçekten uzun zaman alıyor. Yerel bir depo oluşturmak, svnsyncişleri hızlandırmaya yardımcı olur - özellikle de dönüştür komutunuzda bazı yanlış seçenekleriniz olduğu için, bunu birkaç kez yapmanız gerektiğinde.
Debilski

SVN deposunun yerel bir kopyası varsa, tüm bu yöntemlerin daha hızlı olduğunu düşünüyorum. Ama her zaman tam depoya ulaşamazsınız değil mi? svnsyncSadece URL'ye değil, deponun gerçek dosyalarına erişmesi gerektiğini düşündüm .
quark

Lütfen hgsvn'nin Bakım Modunda olduğunu , bu nedenle artık aktif olarak geliştirilmediğini unutmayın. Bunun yerine hgsubversion kullanılmasını önerirler.
Jon L.

5

Bir dosyanın iki düzeltmesini veya geçerli dosyanızı ve önceki bir düzeltmeyi nasıl karşılaştırıyorsunuz?

Her ikisi de kullanın hg diff. Kullanıldığında hg diff, çalışma kopyasındaki tüm değişiklikler ve ipucu (en son işlem) görüntülenir.

"Bir dosyanın iki düzeltmesini nasıl karşılaştırıyorsunuz?"

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

Yukarıdaki komut, "file.code" dosyasının rev1 ve rev2 değerleri arasında farklı gösterecektir.

"Mevcut dosyanızı ve önceki bir düzeltmeyi nasıl karşılaştırıyorsunuz?"

$ hg diff {file.code}

Yukarıdaki komut "file.code" dosyasının geçerli sürümü ile en son revizyon (en son yapılan) arasında farklı gösterilecektir.

: D


4

Belirli bir dosya kümesi için belirli bir düzeltme grubunu nasıl 'işaretler' '' etiketler ''?

$ hg tag my-tag

Ayrıca, özel bir etiket deposu oluşturmak için deponuzu klonlayabilirsiniz .

$ hg clone working-repository my-tag-repository

3
Neden olmasın hg tag my-tag?
Steve Losh

4

Nasıl dallanırsın?

$ hg şube şubem

veya

$ hg klon orijinal depo şubem

Şube bir "sanal" dizin oluşturduğuna dikkat edilmelidir (yani, dosyalar aynı kalır, ancak hg bunları sistem içinde farklıymış gibi davranır), klon ise gerçek, tam bir kopya oluşturur. Açıkçası, klon dallanmıyor.


4
Bu, git insanların tavsiye için Mercurial insanlarla her zaman dalga geçmesinin ağır yolu. Yeni başlayanlar için daha hafif, daha tanıdık bir yol olurduhg branch my-branch
Steve Losh

8
Bunların tamamen farklı iki işlem olduğunu belirtmelisiniz.
stepancheg

2
Mercurial'da dallanma için yararlı olabilecek bu kılavuzu buldum: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard


GoodEnough tarafından bağlanan makale, yer imlerini kullanarak başka bir hafif yöntem sağlar. Kendi dallarını hak etmede önemli olmayan değişiklikler için oldukça iyi görünüyor
Casebash

4

Mercurial için iyi bir GUI / IDE eklentisi?

GUI

  • Hemen hemen her işletim sistemi için TortoiseHg . Windows Explorer entegrasyonunu içerir. Ayrıca Linux ve Max OS X de dahil olmak üzere birkaç işletim sisteminde çalışır: Biraz karmaşık bir arayüze sahiptir ve ilk başta kullanmak için biraz gariptir, ancak çok eksiksiz ve güçlüdür.
  • Murky , Mac OS X 10.5 veya üst sürümlerinde çalışır. Murky, depo ve temel komutları keşfetmek için iyidir, ancak komut satırını nasıl kullanacağınızı da bilmeniz gerekir.
  • MacHg , Murky'den biraz daha fazla işlevselliğe ve cilaya sahip olan güzel bir Mac OS X Gui'dir , ancak yine de komut satırına da ihtiyacınız olacaktır.
  • SourceTree orijinal olarak bir Mac istemcisidir ve Windows sürümü yakın zamanda kullanıma sunulmuştur. Oldukça hoş bir kullanıcı arayüzü (en azından OS X'te), raf dahil Hg özelliklerinin çoğunu destekler.

eklentiler


3

Nasıl değişiklik yaparsınız?

Bu komutu geçerli yerel * mercurial deposundan çağır

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

takma adlar: ci

  • Yerel bir cıva deposunda, geçerli dizinin içinde .hg var

Seçenek nerede olabilir:

 -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

Örnek bir komut şöyledir:

hg commit -m "added readme" README

NOTLAR :

  • Bir dosya listesi atlanırsa, "hg durumu" tarafından bildirilen tüm değişiklikler yapılır.
  • Birleştirme işleminin sonucunu veriyorsanız, herhangi bir dosya adı veya -I / -X filtresi vermeyin.
  • Hiçbir kesinleştirme mesajı belirtilmezse, yapılandırılmış düzenleyici sizden bir mesaj istemek için başlatılır.

3

Mercurial nasıl kurulur?

Mercurial yapılandırma bilgilerini ~/.hgrc* nix sistemlerinde ve %UserProfile%\mercurial.iniWindows sistemlerinde saklar . ( %UserProfile%genellikle "C:\Documents and Settings\[username]\"Windows 2000 veya Windows XP sistemlerinde ve genellikle C:\Users\[username]\Windows Vista ve Windows 7 sistemlerinde bulunur.)

Başlangıç ​​noktası olarak, Mercurial kullanıcı adınızı aşağıdakilere .hgrcveya sitenize yerleştirerek ayarlamanız gerekir mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <email.address@example.net>

Windows sistemlerindeki TortoiseHg kullanıcıları alternatif olarak çalışabilir hgtk userconfig

Ayrıca bkz . " Mercurial: The Definitive Guide " ( 2. Mercurial: The Definitive Guide ) bölümünde yer alan " Mercurial yapılandırma dosyası oluşturma " .


3

Şubeleri nasıl birleştirirsiniz?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary

Yeni bir mercurial kullanıcısı ve genel olarak revizyon kontrolüne kaynak yapan yeni biri olarak, bu cevabı gerçekten anlamıyorum. Yayınınızı netleştirip genişletebilir misiniz? Birleştirme komutunun nasıl kullanılacağını hala tam olarak anlayamıyorum.
Jamin Gray

3

Mercurial nasıl kurulur?

Linux'ta kaynaktan yüklediyseniz veya Windows yükleyicilerini kullandıysanız lütfen güzel bir şekilde düzenleyin.

Mac OS X 10.4 (Kaplan), 10.5 (Leopar)

Python'un easy_install komutunu kullanın ( Setuptools ile ):

sudo easy_install mercurial

Bu, en son sürümü (yazma sırasında 1.3.1) bulur ve şu adresten yüklenir:

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

Python 2.6 ile bu, Mercurial OS X kurulum paketini de (26 Temmuz 2009 itibariyle 1.2.1'de) Python 2.5'e ihtiyaç duyduğundan şikayet ediyor. Gönderen belgeler , Fink ve MacPorts sürümü 1.2 yüklemek anlaşılmaktadır.

Linux

Açık Linux paketlerinin çoğu geçerli sürümün gerisinde kalmaktadır, bu yüzden easy_install (yukarıdaki gibi) kullanın veya Mercurial tarball'ı indirin , arşivi çıkarın, mercurial dizinine geçin ve çalıştırın:

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

( dağıtılmış bir sürüm kontrol sistemi olan Mercurial'ın Tanıtımı'ndan )

pencereler

Mercurial'ın en son sürümünün bir ikili paketi var . TortoiseHg , Mercurial için bir Windows kabuk uzantısıdır ve yükler. Cygwin Mercurial'ı da kurabilir.

Alternatif olarak (talimatlar çok uzun burada bağlantılıdır), Mercurial'ın optimize edilmiş veya saf bir Python sürümünü kaynağından oluşturabilirsiniz.


1
Merkürü kaynağından inşa etmek için, Python başlıklarına ihtiyaç vardır. Paket yönelimli dağıtımları kullananlar için python-dev veya python-devel kurun.
Nicolas Dumazet

3

En son kodu nasıl alırsınız?

Mercurial, bir deponun nereden klonlandığını (.hg / hgrc içinde) hatırlar, böylece şunları yapabilirsiniz:

hg pull

kaynak kodundan en son kodu almak için. (Bu çalışma dizinini güncellemez)

hg update

çalışma dizinini güncellemek için.

hg pull -u

aynı anda hem çekme hem de güncelleme yapmak için.


1
.hg/hgrcBir klon yaptığınızda başlangıç ​​noktası kaydedilir , bu nedenle çekme / itme sırasında belirtmeniz gerekmez. İsterseniz içindeki [paths]bölüme daha fazla yol ekleyebilirsiniz .hg/hgrc.
Martin Geisler

3

Kodu nasıl kontrol edersiniz?

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

Seçenek nerede olabilir:

 -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

Kaynak, depoda bulunan ve uzak bir URL veya bir dosya sistemi dizini olabileceği orijinal dosyaların kaynağıdır . Örneğin:

Hedef, kaynak kodun yerel dosya sisteminizde bulunduğu yerdir.


1

Nasıl değişiklik yaparsınız?

$ hg commit -m "Commit message"

1

Yukarı ittiğinizde yukarı akış deposuna hangi değişikliklerin gönderileceğini nasıl görüyorsunuz?

hg outgoingVarsayılan depoya ayarlanacak değişiklik kümelerinin listesini almak için kullanın :

$ hg outgoing

Gerçek kod değişikliklerini almak için -p( --patch) tuşunu kullanın . Bu, her değişiklik kümesini tam olarak çıktılar:

$ hg outgoing -p

1

Bir dosyayı depodan nasıl kaldırırsınız?

Bir dosyayı depodan kaldırmak ve bir sonraki işlemde silinmesini sağlamak için:

$ hg remove {file(s)}

Bir dosyayı depodan kaldırmak, ancak silmemek için

$ hg remove -Af {file(s)}

veya Mercurial 1.3'ten

$ hg forget {file(s)}

1

Kodun önceki bir sürümüne nasıl dönersiniz?

Gönderen bu soruya

$ hg update [-r REV]

@van: Daha sonra taahhüt verirseniz, etkili bir şekilde yeni bir şube oluşturacaksınız. Daha sonra yalnızca bu dalda çalışmaya devam edebilir veya sonunda mevcut şubeyi birleştirebilirsiniz.


1

Bir Changeset'i nasıl geri alırsınız?

Birkaç seçenek mevcut

Kolay Yol (tek bir değişiklik setini geri al)

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

Zor Yol (manuel olarak fark edin ve uygulayın)

Adım 1 : Revizyon 107 ve 108 arasında değişenleri geri almak için bir yama dosyası oluşturun:

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

(alternatif olarak, - tersi olmayan hg diff -r108 -r107 de aynı şeyi yapar)

2. Adım : Yama dosyasını uygulayın:

patch -p1 < revert-change.patch

Farkın bazıları geçerli olmayabilir, örneğin:

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

.Rej dosyası, uygulanamayan farkın içeriğini içerecektir, bir göz atmanız gerekir.


1
Bunun hg backoutiçin değil mi?
Wim Coenen

Evet, ancak hg backout, backout için yalnızca tek bir değişiklik kümesi kimliğini destekler. Kesinlikle belirtilmelidir, ben buna göre güncelleyecek
slf

1

Bir dosya veya havuzdaki düzeltmelerin geçmişini nasıl görüyorsunuz?

Tüm deponun veya dosyaların düzeltme geçmişini göstermek için

$ hg log {file(s)}

veya

$ hg history {file(s)}

Ve listeyi ters sırada görmek için

$ hg log -r:

1

Bir dalın bölümlerini başka bir dalda nasıl birleştirirsiniz?

.Hg / hgrc dosyanızdaki 'nakli' uzantısını etkinleştirin

[extensions]
transplant=

Hedef dalı yükleyin ve ardından hedef revizyonu nakledin.
örneğin: 'foo' dalından mevcut dalda kiraz toplama revizyonu 81

$ hg transplant -b foo 81

Mercurial'ın daha yeni sürümleri için nakil uzatmasına gerek yoktur. graftAynı işlemi yapmak için yerleşik komutu kullanabilirsiniz. hg help graftdaha fazla bilgi için
DOOManiac

1

Belirli bir değişiklik kümesinden yama nasıl çıkarırsınız?

$ hg export -o patchfile changeset

Daha sonra bunu başka bir şubeye aktarabilirsiniz:

$ hg import patchfile
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.