2009-06-06 40 views
15

Tôi không sử dụng Mercurial, nhưng tôi muốn bắt đầu, vì vậy tôi đang đọc về nó. Hệ thống SCM duy nhất mà tôi đã sử dụng rộng rãi là CVS. Hầu hết những gì tôi đã đọc về Mercurial có ý nghĩa, và âm thanh tốt. Nhưng tôi xen kẽ bị sốc và lúng túng bằng cách đó nó làm thẻ.Làm cách nào tôi có thể biết tất cả các thẻ trong Mercurial?

Thẻ chỉ là biệt hiệu cho một changeset (và bằng 'changeset', chúng tôi thực sự muốn nói trạng thái kết quả từ changeset). Mát mẻ. Ánh xạ từ các thẻ đến ID thay đổi được lưu trữ trong tệp .hgtags. Ngoài ra mát mẻ. Tệp .hgtags được phiên bản.

Cái gì?

Điều này có rất nhiều hậu quả trực quan. Ví dụ, nếu tôi cam kết một changeset mà sau đó tôi muốn gắn thẻ (nói rằng, mã sẽ hình thành bản phát hành 1.0), tôi phải cam kết lại sau khi gắn thẻ, để đưa tệp thẻ được cập nhật vào kho lưu trữ. Và nếu sau đó tôi cập nhật cho changeset được gắn thẻ đó vào một số ngày sau đó, bản sao làm việc sẽ không chứa bất kỳ kiến ​​thức nào về thẻ đó. Nếu tôi làm một số công việc, do đó thành lập một chi nhánh mới (nói, cho sửa lỗi, hướng tới 1.1), chi nhánh đó sẽ không có bất kỳ kiến ​​thức về từ khóa mà nó đã phát triển. Trừ khi tôi sao chép nó bằng tay, đó là.

Và khi phát triển tiếp tục cả trên nhánh gốc và nhánh mới của tôi, với thẻ được tạo để đánh dấu các thay đổi quan trọng (bản phát hành 2.0 trên thân cây, bản phát hành bản sửa lỗi 1.1 và 1.2 trên nhánh), cả hai nhánh sẽ tiếp tục sự thiếu hiểu biết về các thẻ của nhánh khác. Vì vậy, nếu tôi hoàn thành công việc trên một nhánh, và muốn chuyển sang một số thay đổi cụ thể trên một nhánh khác (nói, tôi hoàn thành bản phát hành lỗi 1.2, nhưng bây giờ phải bắt đầu trên bản sửa lỗi 2.1, dựa trên 2.0), bây giờ tôi đã được nhồi. Thay đổi hiện tại của tôi không biết về 2.0!

Tôi có thể làm gì?

  • tôi có thể yêu cầu ai đó làm việc trên các chi nhánh 2.x để đọc ra ID changeset thực tế cho 2.0, và sử dụng một cách rõ ràng, nhưng đây là kinh khủng.
  • Tôi có thể đặt tên các nhánh của mình, cũng như sử dụng thẻ, để tôi có thể nhảy qua đầu của nhánh 2.x, do đó tìm hiểu về các thẻ mới và sau đó quay lại thẻ 2.0. Giả sử rằng các nhánh, không giống như các thẻ, có thể nhìn thấy được - là trường hợp đó? Ngay cả khi nó được, điều này có vẻ clunky.
  • Tôi có thể duy trì một tệp toàn cầu hgtags ngoài kho lưu trữ và sử dụng một số móc để kéo bản sao vào bản cập nhật, ghi đè lên bản sao cục bộ và sao chép lại mọi thay đổi trên cam kết. Tôi không chắc làm thế nào điều này sẽ làm việc trong một môi trường đa người dùng, nơi mà các nhà phát triển đang đẩy những thay đổi vào một kho lưu trữ được chia sẻ; tôi có thể cần một kho lưu trữ riêng biệt chỉ dành cho tệp hgtags.
  • Tôi có thể sử dụng các thẻ cục bộ nằm ngoài cơ chế phiên bản và do đó tránh được toàn bộ vấn đề. Như với các thẻ chung được chia sẻ, tôi sẽ phải đặt một cơ chế để đồng bộ hóa tệp localtags giữa các nhà phát triển.

Không có giải pháp nào trong số này có vẻ hoàn toàn tuyệt vời. Tôi nên làm gì?

Giả định ở đây là tôi đang quản lý các chi nhánh bằng cách sử dụng các chi nhánh được đặt tên trong một kho lưu trữ duy nhất, thay vì kho lưu trữ trên mỗi nhánh. Liệu tình hình sẽ tốt hơn nếu tôi làm việc sau?

+0

@SilentGhost: Tôi đã xóa thẻ 'hg' vì thẻ 'mercurial' được sử dụng nhiều hơn. Nhưng có lẽ đó là một sai lầm? –

Trả lời

19

Versioning file .hgtags cho phép bạn

  • chỉnh sửa thẻ và xem ai sửa chúng (và tại sao nếu họ để lại một cam kết thông báo thích hợp)
  • thẻ chuyển giữa các kho bằng cách sử dụng cơ chế bình thường

Tuy nhiên, có một số sự nhầm lẫn xảy ra ở đây.

  • Bạn viết rằng

    [...] Và nếu tôi sau đó nâng cấp lên rằng changeset được gắn thẻ tại một số ngày sau đó, các bản sao làm việc sẽ không chứa bất kỳ kiến ​​thức về thẻ đó. [...]

    Đó là sai, thẻ được thu thập từ các .hgtags file được tìm thấy trong tất cả các đầu. Điều đó có nghĩa là bạn có thể cập nhật thành thẻ cũ (hg update 0.1) và vẫn thấy tất cả các thẻ của bạn (hg tags).

  • Bạn hỏi xem các chi nhánh có hiển thị chung hay không. Có họ là - tên của các chi nhánh được đặt tên có thể được sử dụng trong bất kỳ ngữ cảnh nào mà bạn cần phải chỉ định một changeset, như các thẻ có thể.

Đảm bảo bạn hiểu ngành được đặt tên trước khi bạn bắt đầu sử dụng chúng. Chúng thực sự là không phải cần thiết để tạo chi nhánh bugfix. Thay vào đó, bạn có thể chọn chỉ cần quay lại (hg update 1.0) và sửa lỗi rồi cam kết. Điều đó sẽ tạo ra một cái đầu mới, mà dòng phát triển của bạn hướng tới 1,1 (điều này mang lại cho bạn multiple heads). Vì vậy, bạn không cần phải tạo ra một chi nhánh được đặt tên để thêm một nhánh phát triển mới vào kho lưu trữ của bạn.

Có nhiều đầu hoàn toàn tương đương với nhiều bản sao. Bạn thậm chí có thể chuyển đổi qua lại: bạn có thể sử dụng

% hg clone -r X-head repo repo-X 

để gỡ rối các X-head changeset và tổ tiên của nó từ changesets khác trong repo. Và bạn có thể kết hợp nhiều bản sao bằng cách đơn giản kéo tất cả các thay đổi thành một bản sao lớn.

Named branches tương tự, nhưng khác nhau. Chúng cho phép bạn nhúng một tên trong mỗi changeset. Vì vậy, bạn có thể có một số thay đổi trong lịch sử của bạn với tên "foo". Khi bạn thực hiện hg update foo, bạn sẽ kết thúc ở phần lớn các thay đổi này. Theo cách này, các nhánh được đặt tên hoạt động như một loại thẻ nổi.

Nếu bạn không thoải mái với ý tưởng nhãn vĩnh viễn cho các thay đổi của mình, bạn có thể thử bookmarks extension. Điều đó cũng sẽ cung cấp cho bạn "thẻ nổi" mà bạn có thể sử dụng để cập nhật, nhưng chúng sẽ không vĩnh viễn là một phần của lịch sử vì chúng không được phiên bản.

Tôi hy vọng điều này sẽ giúp ích một chút.

+0

Aha! Martin, cảm ơn vì đã dọn dẹp nơi tập hợp các thẻ hiển thị đến từ - vấn đề của tôi bốc hơi hoàn toàn. Tôi lấy ý kiến ​​của bạn về các chi nhánh được đặt tên, nghĩa là bạn không phải đặt tên cho chi nhánh để tồn tại. Cảm giác ruột của tôi là các nhánh chưa được đặt tên sẽ dẫn đến nhầm lẫn (đã cam kết thay đổi bugfix dựa trên 1.0, nếu bạn sau đó cập nhật một cái gì đó khác, làm cách nào để quay lại dòng bugfix - bạn không phải biết ID thay đổi?), nhưng tất nhiên tôi chưa thử điều này trong thực tế. –

+0

Bạn nói đúng, bạn phải biết ID thay đổi. "người đứng đầu hg" có thể cho bạn biết điều đó và tiện ích dấu trang có thể cung cấp cho họ tên. Cách dễ nhất là sử dụng nhiều dòng vô tính giống như chúng ta làm trong chính dự án Mercurial. Ở đó chúng tôi có các bản sao và sửa lỗi hg và hg-ổn định đi vào hg-ổn định. Chúng tôi cũng có thể đã sử dụng các chi nhánh được đặt tên, tôi đoán chúng tôi không vì các chi nhánh được đặt tên đã được thêm vào lâu sau khi lược đồ hg/hg ổn định được sử dụng. –

+3

Hiện tại chúng tôi sử dụng các chi nhánh có tên trong chính dự án Mercurial. Ngoài ra, tiện ích dấu trang hiện là một phần của chức năng cốt lõi, có nghĩa là tiện ích mở rộng dấu trang luôn được bật sau khi bạn nâng cấp lên Mercurial 1.8. –

1

Lựa chọn phương pháp gắn thẻ chắc chắn có một số hiệu ứng phụ lạ, nhưng chúng được giải thích rõ trong this wiki.Nó cũng gợi ý rằng bạn sao chép toàn bộ repo và sau đó cập nhật điểm quan tâm để tránh trường hợp bạn sẽ tạo một repo không chứa thẻ đã được sử dụng để tạo ra nó.

Các vấn đề liên quan