Điều đó có nghĩa gì bởi cam kết nguyên tử cho một hệ thống phiên bản?


34

Một trong những lý do tại sao các lập trình viên thích SVN hơn CVS là trước đây cho phép các cam kết nguyên tử? Điều đó có nghĩa là gì ?


Điều này có thể giúp ai đó , nó giải thích nó là gì (nó sử dụng git làm ví dụ, nhưng có thể được áp dụng cho các VCS khác)
Fagner Brack

Câu trả lời:


69

Điều đó có nghĩa là khi bạn thực hiện một cam kết với hệ thống kiểm soát phiên bản, mọi thứ bạn muốn cam kết sẽ được thực hiện, HOẶC không có gì.

Trong CVS, khi bạn cố gắng cam kết, có thể cam kết thành công trên một số tệp, sau đó thất bại ở một số tệp khác (vì chúng đã thay đổi). Điều này khiến kho lưu trữ ở trạng thái không may vì một nửa số cam kết của bạn không có ở đó và có khả năng là bạn đã để mọi thứ ở trạng thái không biên dịch hoặc tệ hơn. Bây giờ bạn phải nhanh chóng tích hợp mọi thay đổi để bạn có thể cam kết các tệp khác trước khi người khác cần cập nhật và nhận bộ thay đổi bị hỏng của bạn.

Trong SVN, điều này sẽ không xảy ra - SVN sẽ cam kết mọi thứ bạn đã thay đổi hoặc sẽ thất bại trong toàn bộ thay đổi. Do đó, bạn sẽ không bao giờ rời khỏi kho lưu trữ trong trạng thái bị hỏng do các vấn đề cam kết.


9
Một kết quả quan trọng của điều này là nếu bạn kiểm tra ở bất kỳ trạng thái nào thì kết quả luôn luôn là trạng thái nhất quán (tất nhiên là không có lỗi người dùng nào như quên cam kết một tệp): Đó từ trước khi cam kết hoặc từ sau các cam kết và không có gì ở giữa. Trong CVS, nó có thể là từ "nửa chừng thông qua cam kết". Hành vi của SVN rất tốt cho những thứ như tích hợp liên tục. Đối với các hệ thống CVS, các hệ thống được sử dụng để thực thi "khoảng thời gian yên tĩnh" trong đó chúng chỉ sử dụng một lần thanh toán nhất định nếu không còn cam kết trong đó thực hiện một số giây / phút nhất định sau khi thanh toán.
Joachim Sauer

2
ký ức đen tối về việc sử dụng CVS vuốt ve tôi trong khi tôi đang đọc nó.
shabunc

9
@Spoike - đúng, nhưng đó là một hành động có chủ ý. Trong CVS, các sự cố có thể xảy ra không phải do lỗi của bạn, trong khi ở SVN bạn phải làm việc với nó.
Michael Kohne

3
@DanNeely - CVS cam kết từng cái một. Đó là lý do tại sao bạn nhận được một phần cam kết - một số tệp đi qua, sau đó nó dừng lại khi nó chạm vào một phần mà nó không thể cam kết (do xung đột). Đó là kết quả của CVS ban đầu đã phát triển từ RCS, tôi nghĩ vậy.
Michael Kohne

4
Ngoài ra, lưu ý rằng với CVS, ngay cả khi bạn không gặp lỗi và mọi thứ được cam kết, ai đó có kết nối nhanh hơn có thể cập nhật cây nguồn của họ giữa chừng cam kết, khiến họ ở trạng thái không nhất quán. (Và tôi hy vọng các dấu thời gian sẽ giống như trải ra, do đó, việc cố gắng kiểm tra cây theo ngày / thời gian rơi vào giữa một cam kết sẽ có kết quả tương tự.)
SamB

15

Điều này được giải thích, ví dụ như trong CVS Bye-bye. Tôi đã bị lật đổ bài viết của Andy Lester :

Nếu tôi cố gắng cam kết trong Subversion, nhưng một trong các tệp có xung đột hoặc đã lỗi thời, không có tệp nào cam kết. Trong CVS, bạn đã có một bộ tệp được cam kết một nửa mà bạn phải sửa NGAY BÂY GIỜ.

Thực tế là CVS buộc lập trình viên phải sửa lỗi hợp nhất ngay lập tức là phản tác dụng. So với điều đó, một tùy chọn để trì hoãn / hủy / hợp nhất các thay đổi là một lợi ích đáng kể.


Các lợi ích khác của SVN so với CVS được giải thích trong bài viết trên là:

  • Phiên bản địa phương của mọi thứ bạn làm
     
    Nếu bạn muốn cvs diff, bạn phải có khả năng kết nối với kho lưu trữ của mình. Không có kết nối mạng, không có khác biệt. Subversion lưu trữ các bản sao nguyên sơ của địa phương về những gì bạn đang làm việc, vì vậy svn diff sẽ hoạt động tốt. Bạn muốn bắt đầu lại? svn hoàn nguyên hoạt động không kết nối, quá.

  • Tên tượng trưng của các phiên bản
     
    CHÍNH là tên của phần đầu của thân cây trong CVS, nhưng tôi luôn muốn có thể nói ra -r-1 ″ như tôi có thể quay trở lại khi ở PVCS ngày. Với CVS, tôi phải thực hiện một bản ghi cvs về những gì tôi đang chỉnh sửa và sau đó trừ đi. Điều đó không vui chút nào. Với Subversion, tôi có thể nói svn diff -r PREV.

  • Báo cáo trạng thái thực
     
    Trong CVS, cách duy nhất bạn có thể thấy nếu có gì đó trên máy chủ mới hơn là cập nhật cvs và hy vọng rằng bất cứ điều gì xảy ra đều không gây ra bất kỳ xung đột nào. Với lệnh trạng thái svn, tôi nhận được trạng thái thực, vì vậy tôi có thể xem liệu có xung đột TRƯỚC KHI tôi thực hiện cập nhật hay không.

  • Xử lý hữu ích các xung đột hợp nhất
     
    Trong CVS, nếu có xung đột, bạn sẽ nhận được các dấu xung đột trong tệp của mình. Trong Subversion, bạn nhận được các điểm đánh dấu xung đột, CỘNG một bản sao của tệp gốc, xung đột trước, PLUS phiên bản được gửi xuống từ máy chủ, PLUS phiên bản mà bạn đang chỉnh sửa ban đầu. Sau đó, bạn phải giải quyết rõ ràng svn giải quyết filename.txt để thông báo cho Subversion rằng bạn đã khắc phục sự cố. Không còn vô tình cam kết trở lại vào CVS với các dấu hiệu xung đột vẫn còn đó.


8

Điều đó có nghĩa là tất cả các thay đổi đối với tất cả các tệp được cam kết trong một giao dịch, do đó, tất cả đều thành công hoặc không có gì.

Điều này có nghĩa là bạn ít có khả năng nhận được các chỉnh sửa một phần được kiểm tra vào kho lưu trữ khiến các bản dựng bị lỗi. Bạn vẫn có thể khiến mọi người quên kiểm tra tất cả các tệp có liên quan, nhưng đó là vấn đề về quy trình chứ không phải là vấn đề với hệ thống phiên bản.


nó không phải là một điều tốt sau đó? Nếu không, một cam kết một phần sẽ dẫn đến các tệp không đồng bộ.
Geek

2
vâng, đó là một điều tốt, một phần cam kết là xấu
jk.
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.