Mercurial cho người mới bắt đầu: Hướng dẫn thực hành dứt khoát


237

Lấy cảm hứng từ Git cho người mới bắt đầu: Hướng dẫn thực tế dứt khoát .

Đây là một bộ sưu tập thông tin về việc sử dụng Mercurial cho người mới bắt đầu cho thực tế sử dụng.

Người mới bắt đầu - một lập trình viên đã chạm vào kiểm soát nguồn mà không hiểu rõ về nó.

Thực tế - bao gồm các tình huống mà phần lớn người dùng thường gặp phải - tạo một kho lưu trữ, phân nhánh, hợp nhất, kéo / đẩy từ / đến một kho lưu trữ từ xa, v.v.

Ghi chú :

  • Giải thích làm thế nào để hoàn thành công việc thay vì cách thực hiện.
  • Giải quyết một câu hỏi cho mỗi câu trả lời.
  • Trả lời rõ ràng và chính xác nhất có thể.
  • Chỉnh sửa / mở rộng một câu trả lời hiện có thay vì tạo một câu trả lời mới trong cùng một chủ đề.
  • Vui lòng cung cấp một liên kết đến wiki Mercurial hoặc Sách HG cho những người muốn tìm hiểu thêm.

Câu hỏi:

Cài đặt / Cài đặt

Làm việc với mã

Gắn thẻ, phân nhánh, phát hành, đường cơ sở

Khác

Tài liệu tham khảo khác của Mercurial

Câu trả lời:


16

Làm thế nào để bạn cấu hình nó để bỏ qua các tập tin?

Bỏ qua được cấu hình trong một tệp văn bản bình thường được gọi là .hgignore trong thư mục gốc của kho lưu trữ của bạn. Thêm nó giống như một tập tin bình thường với:

hg add .hgignore

Có hai tùy chọn cú pháp có sẵn để khớp tệp, toàn cầu và biểu thức chính quy. global là mở rộng tên tập tin giống như unix và biểu thức chính quy là biểu thức chính quy. Bạn kích hoạt từng cái bằng cách thêm syntax: globhoặc syntax: regexptrên một dòng của chính nó. Tất cả các dòng tiếp theo sẽ sử dụng cú pháp đó, cho đến khi đánh dấu cú pháp tiếp theo. Bạn có thể có nhiều đánh dấu cú pháp như bạn muốn. Cú pháp mặc định là regapi, vì vậy nếu bạn chỉ sử dụng regrec, bạn không cần bất kỳ dấu cú pháp nào.

Bạn có thể thêm ý kiến ​​với #

Thí dụ:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Bỏ qua chỉ áp dụng cho các tệp không được quản lý (tức là các tệp chưa được kiểm tra). Để bỏ qua các tệp nằm dưới sự kiểm soát phiên bản, bạn có thể sử dụng các công tắc -I và -X.


7
Có thể hữu ích khi đề cập rằng nếu bạn hg addbỏ qua các tệp thủ công, Mercurial sẽ theo dõi chúng. Ví dụ, nếu bạn có một loạt các tập tin như deploy-test.conf, deploy-production.conf, vv và không muốn phiên bản họ (họ có thể có mật khẩu trong họ) nhưng bạn làm muốn phiên bản deploy-template.confbạn chỉ có thể bỏ qua deploy*và tự thêm deploy-templace.conf.
Steve Losh

7

Làm thế nào để bạn thấy những gì không được cam kết, hoặc trạng thái của cơ sở mã hiện tại của bạn?

Để xem danh sách các tệp đã được thay đổi:

$ hg status

Điều này sẽ in từng tệp đã được thay đổi cùng với trạng thái của nó, có thể bao gồm:

  • M- Sửa đổi. Các tập tin đã được thay đổi và những thay đổi đã không được cam kết.
  • A- Thêm. Tệp không được theo dõi trước đó, nhưng nếu bạn cam kết Mercurial sẽ bắt đầu theo dõi nó.
  • R- Đã xóa. Tệp đã được theo dõi trước đó, nhưng nếu bạn cam kết Mercurial sẽ ngừng theo dõi nó trong lần cam kết này và trong tương lai.
  • ?- Không xác định. Các tập tin hiện không được theo dõi bởi Mercurial. Cam kết sẽ không có hiệu lực đối với nó trừ khi bạn sử dụng hg addđể thêm nó.
  • !- Còn thiếu. Các tập tin đã được theo dõi nhưng Mercurial không thể tìm thấy nó trong bản sao làm việc.

Để xem những thay đổi đã thực sự được thực hiện đối với các tệp:

$ hg diff

6

Làm thế nào để bạn tạo một dự án / kho lưu trữ mới?

$ hg init my-repository

5

Làm cách nào để giao diện với Subversion?

Có ba cách:


Các phần mở rộng chuyển đổi sẽ clone một kho lưu trữ Subversion hiện có thành một Mercurial. Nó đi kèm với Mercurial. Nó hoạt động đại khái như thế này:

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

Ví dụ, điều này sẽ lấy trung kế của kho lưu trữ ghi nhớ SixApart.

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

Tiện ích mở rộng có thể tăng dần các bản sửa đổi mới từ kho lưu trữ Subversion vào kho Mercurial (giống như kéo). Tuy nhiên, nó không hỗ trợ thực hiện các sửa đổi Mercurial và gửi chúng trở lại Subversion (không đẩy). [XXX: Sửa lỗi này nếu nó sai] .


Phần mở rộng hssubversion . Theo nhiều cách, đây là giải pháp tinh vi nhất vì nó sử dụng API Subversion để liên lạc với kho Subversion. Nó nhằm mục đích trở thành cầu hg-svn. Nó cho phép vấp ngã hoàn toàn các bản sửa đổi (bản sao đầy đủ, kéo và đẩy), tuy nhiên, khi viết bài này [XXX: Sửa đổi điều này nếu / khi nó không chính xác] nó vẫn đang được phát triển và chưa có bản phát hành chính thức. Kết quả là nó chỉ hoạt động với Mercurial cập nhật nhất (1.3 khi viết bài này).

  • Nó ánh xạ các thẻ và các nhánh (trước tất cả các thẻ tags/để phân biệt chúng với các nhánh được đặt tên tương đương).
  • Nó duy trì một nhánh đặc biệt closed-branchesđể đóng các nhánh bị loại bỏ trong Subversion.
  • yêu cầu kho lưu trữ Subversion được đặt theo quy ước của thân / nhánh / thẻ.
  • Tập lệnh thường là hg svn <subcommand>mặc dù nó nhằm mục đích tích hợp đến mức bạn không cần phần 'svn' (nghĩa là nó muốn xử lý một bản sao Subversion càng nhiều càng tốt như bất kỳ kho lưu trữ Mercurial nào khác).;

Nó hoạt động như thế này:

nhân bản:

hg svnclone <Subversion URL> 

HOẶC (chỉ dành cho svn://URL)

hg clone <svn:// URL>

kéo:

hg svn pull

đẩy:

hg svn push

mới đến:

hg svn incoming

hướng ngoaị:

hg svn outgoing

Kiểm tra toàn bộ kho lưu trữ:

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

Các hgsvn tiện ích ( cây bitbucket ). Cho đến gần đây, điều này chỉ cho phép bạn sao chép và kéo một kho lưu trữ Subversion, nhưng vì hgsvn 0.1.7nó hỗ trợ đẩy. [Tôi không biết làm thế nào tốt nó đẩy. Bất cứ ai có nhiều kinh nghiệm nên cập nhật điều này.] Nó có các tính năng đáng chú ý sau:

  • Nó tạo ra một thẻ Mercurial cho mỗi thẻ SVN.
  • Nó đặt một thẻ cục bộ trên mỗi bộ thay đổi để đánh dấu sửa đổi SVN của nó.
  • Nó đặt mọi sửa đổi Mercurial trên một nhánh được đặt tên theo nhánh SVN của nó. Ví dụ branches/some-featuresẽ như thế nào hg branch some-feature. Nó đặt thân cây lên trunk(tức là không có gì trên nhánh mặc định của Mercurial, trừ khi người dùng rõ ràng chuyển sang nó.)
  • Nó sẽ cố gắng xác định các nhánh và thẻ, và tạo chúng nhưng nếu không thể, nó chỉ bỏ qua chúng. Điều này rất hữu ích khi kho lưu trữ Subversion không tuân theo bố cục trung kế / nhánh / thẻ thông thường.

Nó hoạt động như thế này:

nhân bản:

hgimportsvn <Subversion URL>

kéo:

hgpullsvn

đẩy:

hgpushsvn

mới đến:

hgpullsvn -n

hướng ngoaị:

hgpushsvn -n

Kiểm tra toàn bộ kho lưu trữ:

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

Kiểm tra chỉ thân cây:

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

2
Tôi mới sử dụng hg convertvà thực sự phải mất một thời gian dài khi bạn có một kho lưu trữ svn với nhiều cam kết. Thiết lập một kho lưu trữ cục bộ svnsyncgiúp tăng tốc rất nhiều thứ - đặc biệt là khi bạn cần thực hiện nhiều lần, bởi vì bạn có một số tùy chọn sai trong lệnh convert.
Debilski

Tôi nghĩ rằng tất cả các phương pháp này nhanh hơn nếu bạn có một bản sao lưu trữ SVN cục bộ. Nhưng bạn không thể luôn luôn có được tại kho đầy đủ phải không? Tôi nghĩ rằng svnsynccần phải truy cập vào các tập tin thực tế của kho lưu trữ, không chỉ URL.
quark

Xin lưu ý rằng hssvn hiện đang ở Chế độ bảo trì , vì vậy nó không còn được phát triển tích cực. Họ khuyên bạn nên sử dụng chuyển đổi thay thế.
Jon L.

5

Làm thế nào để bạn so sánh hai phiên bản của một tập tin, hoặc tập tin hiện tại của bạn và một phiên bản trước đó?

Cả hai sử dụng hg diff. Khi hg diffđược sử dụng, tất cả các thay đổi trong bản sao làm việc và mẹo (cam kết mới nhất) được hiển thị.

Đối với "Làm thế nào để bạn so sánh hai phiên bản của một tập tin?"

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

Lệnh trên sẽ hiển thị khác nhau giữa rev1 và rev2 của "file.code".

Đối với "Làm thế nào để bạn so sánh tập tin hiện tại của bạn và một phiên bản trước?"

$ hg diff {file.code}

Lệnh trên sẽ hiển thị khác nhau giữa phiên bản hiện tại của "file.code" và phiên bản sửa đổi mới nhất (lần cam kết gần nhất).

: D


4

Làm thế nào để bạn 'đánh dấu' 'thẻ' hoặc 'phát hành' một bộ sửa đổi cụ thể cho một bộ tệp cụ thể để bạn luôn có thể lấy cái đó sau?

$ hg tag my-tag

Bạn cũng có thể sao chép kho lưu trữ của mình để tạo kho lưu trữ thẻ đặc biệt .

$ hg clone working-repository my-tag-repository

3
Tại sao không hg tag my-tag?
Steve Losh

4

Làm thế nào để bạn chi nhánh?

$ hg chi nhánh của tôi

hoặc là

$ hg clone gốc-repository my-Branch

Mặc dù cần lưu ý rằng nhánh tạo ra một thư mục "ảo" (nghĩa là các tệp vẫn giữ nguyên, nhưng hg đối xử với chúng như thể chúng khác nhau trong hệ thống), trong khi bản sao tạo ra một bản sao hoàn chỉnh thực sự. Nói đúng ra, bản sao không phân nhánh.


4
Đây là cách nặng nề mà những người git luôn tạo ra niềm vui cho những người Mercurial để giới thiệu. Một cách nhẹ nhàng hơn, quen thuộc hơn với người mới bắt đầu sẽ làhg branch my-branch
Steve Losh

8
Bạn phải lưu ý rằng đây là hai hoạt động hoàn toàn khác nhau.
stepancheg

2
Tôi tìm thấy hướng dẫn này có thể hữu ích cho việc phân nhánh trong Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard

Đối với các nhánh nhẹ trong hg không cố định (như nhánh hg), hãy sử dụng tiện ích mở rộng dấu trang đồng bóng
hultqvist

Bài viết được liên kết bởi GoodEnough cung cấp một phương pháp nhẹ khác bằng cách sử dụng dấu trang. Có vẻ khá tốt cho những thay đổi không đáng kể để xứng đáng với chi nhánh của chính họ
Casebash

4

Plugin GUI / IDE tốt cho Mercurial?

GUI

  • Rùa cho bất kỳ hệ điều hành. Bao gồm tích hợp Windows Explorer. Nó cũng hoạt động trong Linux và một vài hệ điều hành khác: bao gồm Max OS X. Nó có giao diện hơi cục mịch và hơi khó sử dụng lúc đầu, nhưng nó rất đầy đủ và mạnh mẽ.
  • Âm u chạy trên Mac OS X 10.5 trở lên. Murky tốt cho việc khám phá kho lưu trữ và các lệnh cơ bản, nhưng bạn sẽ cần biết cách sử dụng dòng lệnh.
  • MacHg là một Mac OS X Gui đẹp, có nhiều chức năng và đánh bóng hơn Murky, nhưng bạn vẫn sẽ cần dòng lệnh với nó.
  • SourceTree là một máy khách Mac ban đầu, với phiên bản Windows mới xuất hiện gần đây. Giao diện người dùng khá đẹp (ít nhất là trên OS X), hỗ trợ phần lớn các tính năng Hg, bao gồm cả giá đỡ.

bổ sung


3

Làm thế nào để bạn cam kết thay đổi?

Gọi lệnh này từ kho lưu trữ cục bộ * hiện tại

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

bí danh: ci

  • Một kho lưu trữ cục bộ có .hg trong thư mục hiện tại

Trường hợp tùy chọn có thể là:

 -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

Một lệnh ví dụ sẽ là:

hg commit -m "added readme" README

GHI CHÚ :

  • Nếu danh sách các tệp bị bỏ qua, tất cả các thay đổi được báo cáo bởi "trạng thái hg" sẽ được cam kết.
  • Nếu bạn đang cam kết kết quả hợp nhất, không cung cấp bất kỳ tên tệp hoặc bộ lọc -I / -X nào.
  • Nếu không có thông báo cam kết nào được chỉ định, trình chỉnh sửa được cấu hình sẽ bắt đầu nhắc bạn về một tin nhắn.

3

Làm thế nào để thiết lập Mercurial?

Mercurial lưu trữ thông tin cấu hình của nó trong ~/.hgrccác hệ thống * nix và %UserProfile%\mercurial.initrên các hệ thống Windows. ( %UserProfile%thường là "C:\Documents and Settings\[username]\"trên các hệ thống Windows 2000 hoặc Windows XP và thông thường C:\Users\[username]\trên các hệ thống Windows Vista và Windows 7.)

Để bắt đầu, bạn nên đặt tên người dùng Mercurial bằng cách đặt các mục sau vào .hgrchoặc mercurial.ini:

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

Người dùng TortoiseHg trên các hệ thống Windows có thể chạy thay thế hgtk userconfig

Xem thêm " Tạo tệp cấu hình Mercurial " trong chương 2 của " Mercurial: The Definitive Guide ".


3

Làm thế nào để bạn hợp nhất các chi nhánh?

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

Là một người dùng đồng bóng mới và nói chung là một người mới đối với kiểm soát sửa đổi nguồn, tôi không thực sự hiểu câu trả lời này. Bạn có thể làm rõ và mở rộng bài viết của bạn? Tôi vẫn không hiểu cách sử dụng lệnh hợp nhất.
Jamin Gray

3

Làm thế nào để cài đặt Mercurial?

Vui lòng chỉnh sửa độc đáo nếu bạn đã cài đặt từ nguồn trên Linux hoặc sử dụng trình cài đặt Windows.

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

Sử dụng easy_install của Python (với Setuptools ):

sudo easy_install mercurial

Điều này tìm thấy phiên bản mới nhất (1.3.1 tại thời điểm viết) và cài đặt tại:

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

Với Python 2.6, điều này cũng xoay quanh gói trình cài đặt Mercurial OS X (tại 1.2.1 kể từ ngày 26 tháng 7 năm 2009) phàn nàn rằng nó cần Python 2.5. Từ tài liệu , có vẻ như Fink và Macports cài đặt phiên bản 1.2.

Linux

Hầu hết các gói Linux rõ ràng dường như tụt hậu so với phiên bản hiện tại, vì vậy hãy sử dụng easy_install (như trên) hoặc tải xuống tarball Mercurial , giải nén tệp lưu trữ, thay đổi thư mục đồng bóng và chạy:

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

(từ Giới thiệu Mercurial, một hệ thống kiểm soát phiên bản phân tán )

các cửa sổ

Có một gói nhị phân của phiên bản mới nhất của Mercurial . TortoiseHg là một phần mở rộng vỏ Windows cho và cài đặt, Mercurial. Cygwin cũng có thể cài đặt Mercurial.

Ngoài ra (hướng dẫn quá dài nên được liên kết tại đây), bạn có thể xây dựng phiên bản Python tối ưu hoặc thuần túy của Mercurial từ nguồn.


1
Để xây dựng đồng bóng từ nguồn, người ta sẽ cần các tiêu đề Python. Cài đặt python-dev hoặc python-devel cho những người sử dụng phân phối hướng gói.
Nicolas Dumazet

3

Làm thế nào để bạn có được mã mới nhất?

Mercurial nhớ nơi lưu trữ được sao chép từ (trong .hg / hgrc) để bạn có thể chạy một cách đơn giản:

hg pull

để lấy mã mới nhất từ ​​kho lưu trữ gốc. (Điều này không cập nhật thư mục làm việc)

hg update

để cập nhật thư mục làm việc.

hg pull -u

để thực hiện cả kéo và cập nhật cùng một lúc.


1
Nguồn gốc được ghi lại .hg/hgrckhi bạn thực hiện một bản sao, vì vậy bạn không phải chỉ định nó khi bạn kéo / đẩy. Bạn có thể thêm nhiều đường dẫn đến [paths]phần trong .hg/hgrcnếu bạn muốn.
Martin Geisler

3

Làm thế nào để bạn kiểm tra mã?

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

Trường hợp tùy chọn có thể là:

 -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

Nơi nguồn là nguồn của các tệp gốc nằm trong kho lưu trữ, nơi nó có thể là một URL từ xa hoặc một thư mục hệ thống tệp. Ví dụ:

Và đích là nơi mã nguồn sẽ được đặt trong hệ thống tệp cục bộ của bạn.


1

Làm thế nào để bạn cam kết thay đổi?

$ hg commit -m "Commit message"

1

Làm thế nào để bạn thấy những thay đổi sẽ được gửi đến kho lưu trữ ngược dòng khi bạn đẩy?

Sử dụng hg outgoing để lấy danh sách các thay đổi sẽ được đặt thành kho lưu trữ mặc định:

$ hg outgoing

Để có được các thay đổi mã thực tế, sử dụng -p( --patch). Điều này sẽ xuất ra từng thay đổi đầy đủ:

$ hg outgoing -p

1

Làm thế nào để bạn loại bỏ một tập tin từ kho lưu trữ?

Để xóa một tệp khỏi kho lưu trữ và xóa nó trong lần xác nhận tiếp theo:

$ hg remove {file(s)}

Để xóa một tệp khỏi kho lưu trữ, nhưng không xóa nó

$ hg remove -Af {file(s)}

hoặc từ Mercurial 1.3

$ hg forget {file(s)}

1

Làm thế nào để bạn quay lại phiên bản trước của mã?

Từ câu hỏi này

$ hg update [-r REV]

@van: Nếu sau này bạn cam kết, bạn sẽ tạo một chi nhánh mới một cách hiệu quả. Sau đó, bạn có thể tiếp tục chỉ làm việc trên nhánh này hoặc cuối cùng hợp nhất cái hiện có vào nó.


1

Làm thế nào để bạn hoàn nguyên một Changeet?

Một vài lựa chọn có sẵn

Easy Way (sao lưu một bộ thay đổi duy nhất)

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

Hard Way (thủ công khác và áp dụng)

Bước 1 : Tạo tệp vá để hoàn nguyên những gì đã thay đổi giữa phiên bản 107 và 108:

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

(luân phiên, hg diff -r108 -r107 không có --reverse sẽ làm điều tương tự)

Bước 2 : Áp dụng tệp vá:

patch -p1 < revert-change.patch

Một số khác biệt có thể không áp dụng, ví dụ:

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

Tệp .rej sẽ chứa nội dung của diff không áp dụng, bạn sẽ cần phải xem.


1
Đây không phải hg backoutlà những gì cho?
Wim Coenen

Có, tuy nhiên hg backout chỉ hỗ trợ một id thay đổi duy nhất cho backout. Chắc chắn nên được đề cập, tôi sẽ cập nhật cho phù hợp
slf

1

Làm thế nào để bạn thấy lịch sử sửa đổi một tập tin hoặc kho lưu trữ?

Để hiển thị lịch sử sửa đổi của toàn bộ kho lưu trữ hoặc tệp

$ hg log {file(s)}

hoặc là

$ hg history {file(s)}

Và để xem danh sách theo thứ tự ngược lại

$ hg log -r:

1

Làm thế nào để bạn hợp nhất các bộ phận của một chi nhánh vào một chi nhánh khác?

Kích hoạt tiện ích mở rộng 'ghép' trong .hg / hgrc của bạn

[extensions]
transplant=

Tải nhánh đích sau đó ghép bản sửa đổi đích.
ví dụ: cherry pick phiên bản 81 từ chi nhánh 'foo' vào chi nhánh hiện tại

$ hg transplant -b foo 81

Các phiên bản mới hơn của Mercurial không cần gia hạn ghép. Bạn có thể sử dụng graftlệnh tích hợp để làm tương tự. hg help graftđể biết thêm thông tin
DOOManiac

1

Làm thế nào để bạn trích xuất một bản vá từ một bộ thay đổi cụ thể?

$ hg export -o patchfile changeset

Sau đó, bạn có thể nhập cái này vào một chi nhánh khác với:

$ hg import patchfile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.