2012-03-30 27 views
8

Một blog bangHiểu Nhãn hạn chế

Nhãn đi kèm với một cảnh báo lớn mặc dù - nhãn tự không phiên bản kiểm soát, có nghĩa là không có cách nào để theo dõi hay kiểm tra lịch sử hoạt động trên một nhãn. Ngoài ra, nhãn không giữ bản sao của các phiên bản trong trường hợp xóa tệp, do đó, nếu tệp bị xóa, bất kỳ nhãn nào dựa vào phiên bản của tệp đó về bản chất đều được gắn.

Đây không phải là nơi duy nhất tôi đã đọc thông tin tương tự về nhãn TFS. Việc thiếu lịch sử là đủ rõ ràng. Phần thứ hai "nhãn không giữ bản sao của các phiên bản ..." là không rõ ràng. Trên thực tế, tôi đã tạo một dự án thử nghiệm> gắn nhãn nó> đã xóa một tệp> đã thực hiện Lấy theo nhãn và tệp đã quay lại. Vậy cái này đề cập đến cái gì? Chức năng nhãn đã thay đổi trong TFS như gần đây chưa?

Tôi nhận thấy rằng việc xóa tệp không thực sự xóa lịch sử, đó có phải là nguyên nhân không? Nói cách khác, nếu tôi chạy

tf phá hủy "$/MyTeamProject/dự án/FileName.cs"

Là những gì nó có nghĩa là để xóa một tập tin? Nếu vậy, đó có vẻ là một tình huống bất thường để thậm chí xem xét. Ý tôi là, việc xóa lịch sử không thể khôi phục có chủ ý của nó. Thay đổi sẽ không có bất kỳ cải tiến nào so với nhãn trong trường hợp này.

Trả lời

2

Khi chúng tôi áp dụng nhãn, chúng tôi thực hiện điều đó cho phiên bản kiểm soát nguồn tại một thời điểm. Bằng trực giác, bởi vì ban đầu chúng tôi đã tạo một ảnh chụp nhanh kiểm soát nguồn tại một thời điểm, người ta có thể giả định ảnh chụp nhanh thể hiện mã nguồn tại một thời điểm.

Điều này không đúng. Nhãn có thể được chỉnh sửa sau khi tạo.

Khái niệm, nhãn xác định sản phẩm và sửa lỗi của sản phẩm (source). Một ví dụ thế giới thực có thể hữu ích. Giả sử chúng ta có một sản phẩm gọi là AlphaBoogerBear. AlphaBoogerBear là một sản phẩm, không phải là một phiên bản (nghĩ rằng các tên Windows trước khi phát hành). AlphaBoogerBear có thể được tạo thành Nhãn, AlphaBoogerBearLabel. Chúng tôi thực hiện phát hành AlphaBoogerBear. Có một số lỗi. Chúng tôi sửa chúng.

Bây giờ, chúng tôi quay lại và chỉnh sửa AlphaBoogerBearLabel để bao gồm các sửa lỗi. Nhãn không còn đại diện cho ảnh chụp nhanh tại một thời điểm. Thay vào đó, nó đại diện cho bản phát hành ổn định nhất của AlphaBoogerBear.

Cuối cùng, chúng tôi chuyển sang BetaBoogerBear. Chúng tôi có tùy chọn quay lại và lấy nhãn đại diện cho sản phẩm cũ ở phiên bản tốt nhất của nó kịp thời.

Theo ý kiến ​​của tôi, nếu người dùng yêu cầu ảnh chụp nhanh phiên bản kiểm soát nguồn thì tốt hơn nên phân nhánh. Nếu yêu cầu ảnh chụp có thể chỉnh sửa đại diện cho bản phát hành sản phẩm thì Nhãn sẽ hữu ích.Mặc dù, nó có vẻ là một sự cân bằng khó khăn của sự tin tưởng và tiện lợi.

Theo như ý định của tác giả, tôi thực sự không thể nói chắc chắn. Ông có thể có nghĩa là để nói rằng các mục có thể được xóa từ một nhãn và do đó khi bạn Nhận bởi Label mục sẽ biến mất. Mặc dù, mục vẫn được lưu trữ trong lịch sử TFS vì vậy mặc dù nó là một tình huống khó hiểu, không phải tất cả đều bị mất.

1

Tôi không chắc chắn ý nghĩa của câu về nhãn bị ảnh hưởng bởi việc xóa tệp. Nhưng bạn có nó đúng, một tập tin thường xuyên xóa sẽ không ảnh hưởng đến nhãn, nhưng một phá hủy sẽ.

Điều bạn nên cảnh báo về việc không được kiểm soát phiên bản là ai đó có thể đến và chỉnh sửa nhãn, bằng cách bao gồm hoặc loại trừ tệp khỏi nhãn hoặc thay đổi phiên bản tệp được bao gồm trong nhãn. Và sẽ không có lịch sử của những thay đổi này đối với định nghĩa nhãn.

0

Như tôi đã hiểu, nhãn trong TFS về cơ bản là tập hợp/bộ sưu tập của changesets.

Giả sử bạn gắn nhãn thư mục có hai tệp trong đó. Nhãn sau đó sẽ bao gồm ba changesets: một cho thư mục và một cho mỗi tập tin. Xóa một trong các tệp này trong TFS sẽ tạo ra một changeset mới cho thư mục, do đó, thực hiện Get by Label ở giai đoạn này sẽ nhận được tệp đã bị xóa "back" vì nó chứa các changeset trước khi xóa. Phá hủy một tệp sẽ xóa tệp khỏi bất kỳ bản ghi thay đổi nào đã xuất hiện, do đó cũng phá hủy thông tin trong nhãn.

Vì nhãn chỉ được xác định theo tên của nó, nên cũng rất dễ ghi đè nhãn bằng nhãn mới, phá hủy thông tin cũ. Tham số /child cho lệnh này có thể thay đổi hành vi này một chút: sử dụng /child:merge sẽ giữ các thay đổi đã được ghi lại trước đó cùng với một thay đổi mới, /child:replace sẽ trao đổi các changeset cũ với mới. Trong ví dụ trên, không có lựa chọn nào trong số các lựa chọn thay thế này sẽ tạo ra bất kỳ sự khác biệt nào, vì Nhận theo Nhãn sẽ vẫn lấy ra các thay đổi cao nhất.