This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.

Căn Bản Kiểm Soát Phiên Bản

Một hệ thống kiểm soát phiên bản (hay hệ thống kiểm soát thay đổi) là một hệ thống mà theo dõi xuyên suốt thời gian những phiên bản tăng dần (hay thay đổi) của những tập tin và trong một vài trường hợp, của những thư mục. Việc chỉ theo dõi những phiên bản khác nhau của những tập tin và thư mục của người sử dụng (hoặc nhóm người sử dụng) không đáng kể lắm. Điều làm cho hệ thống kiểm soát phiên bản hữu dụng đó là thực tế nó cho phép bạn khám phá những thay đổi trên mỗi phiên bản đó và tạo điều kiện cho việc thu hồi những mục giống nhau.

Trong phần này, chúng tôi sẽ giới thiệu một số thành phần và khái niệm tương đối cao cấp. Chúng tôi sẽ giới hạn việc thảo luận trong những hệ thống kiểm soát phiên bản hiện đại—trong thế giới kết nối ngày nay, có rất trong số những hệ thống kiểm soát phiên bản mà không thể hoạt động thông qua hệ thống mạng diện rộng.

Kho lưu trữ

Ở trung tâm của hệ thống kiểm soát phiên bản là một kho lưu trữ, là kho trung tâm của dữ liệu hệ thống. Kho lưu trữ thường lưu trữ thông tin ở dạng cây hệ thống tập tin—là một cấu trúc phân cấp của những tập tin và thư mục. Bất kỳ ứng dụng khách nào cũng có thể kết nối vào kho để đọc và ghi vào những tập tin này. Với việc ghi dữ liệu, ứng dụng khách làm cho thông tin có sẵn cho những ứng dụng khách khác; với việc đọc dữ liệu, ứng dụng khách nhận thông tin từ các ứng dụng khách khác. Figure 1.1, “Một hệ thống chủ/khách kinh điển” minh hoạ điều này.

Figure 1.1. Một hệ thống chủ/khách kinh điển

Một hệ thống chủ/khách kinh điển

Có gì thú vị ở đây? Đây dường như là định nghĩa của một máy chủ tập tin thông thường. Thực sự, kho lưu trữ một dạng máy chủ tập tập tin, nhưng không phải là loại tập tin thông thường. Điều làm cho kho lưu trữ đặc biệt đó là khi những tập tin trong kho lưu trữ bị thay đổi, kho ghi nhớ từng phiên bản của những tập tin này.

Khi một ứng dụng khách đọc dữ liệu từ kho, thông thường nó chỉ thấy phiên bản mới nhất của cây hệ thống tập tin. Nhưng điều thú vị của ứng dụng khách kiểm soát phiên bản đó là nó có khả năng yêu cầu những trạng thái trước đó của hệ thống tập tin từ kho. Ứng dụng khách có thể hỏi những câu hỏi mang tính lịch sử như là Thư mục này chứa những gì vào thứ Tư trước?Ai là người cuối cùng thay đổi tập tin này, và đã thực hiện những thay đổi nào? Đây là những loại câu hỏi kinh điển của bất kỳ hệ thống kiểm soát phiên bản nào.

Bản sao làm việc

Giá trị của một hệ thống kiểm soát phiên bản đến từ thực tế là nó theo dõi những phiên bản của những tập tin và thư mục, trong khi phần còn lại của thế giới phần mềm không hoạt động trên các phiên bản của những tập tin và thư mục. Đa số những chương trình phần mềm chỉ có thể hoạt động trên một phiên bản duy nhất của một loại tập tin cụ thể. Vậy làm cách nào người sử dụng kiểm soát phiên bản tương tác với một kho lưu trữ trừu tượng—và, thường là ở xa—với đầy những phiên bản của những tập tin khác nhau? Làm cách nào phần mềm xử lý văn bản, phần mềm trình chiếu, trình soạn thảo mã nguồn, phần mềm thiết kế web hoặc những chương trình khác —tất cả đều thao tác trên những tập tin dữ liệu đơn giản—của anh ấy hay cô ấy truy cập vào những tập tin này? Câu trả lời được tìm thấy trong cấu trúc kiểm soát phiên bản được biết đến là bản sao làm việc.

Một bản sao làm việc, theo đúng nghĩa đen là một bản sao cục bộ của một phiên bản cụ thể của dữ liệu kiểm soát phiên bản mà trên đó người sử dụng được tự do thay đổi. Bản sao làm việc[5] hiện diện với các phần mềm khác cũng giống như bất kỳ thư mục cục bộ bình thường khác với đầy đủ các tập tin, như vậy những chương trình đó không cần thiết phải quan-tâm-kiểm-soát-phiên-bản để đọc và ghi dữ liệu đó. Nhiệm vụ quản lý bản sao làm việc và giao tiếp những thay đổi trên nội dung của nó đến và đi từ các kho lưu trữ là do ứng dụng kiểm soát phiên bản khách đảm trách.

Mô hình phiên bản

Nếu nhiệm vụ chính của một hệ thống kiểm soát phiên bản là theo dõi những phiên bản khác nhau của thông tin kỹ thuật số xuyên suốt thời gian, một nhiệm vụ phụ cũng rất quan trọng trong bất kỳ hệ kiểm soát phiên bản nào hiện đại nào đó là cho phép hợp tác chỉnh sửa và chia sẽ dữ liệu. Những hệ thống khác nhau sử dụng những chiến thuật khác nhau để đạt được điều đó. Việc hiểu rõ những chiến thuật khác biệt này là cần thiết vì một vài lý do. Trước tiên, nó sẽ giúp bạn so sánh và đối chiếu những hệ kiểm soát phiên bản đang tồn tại, trong trường hợp bạn tiếp cận những hệ thống khác tương tự như Subversion. Xa hơn nữa, nó cũng sẽ giúp bạn sử dụng Subversion hiệu quả hơn, bởi vì Subversion bản thân nó hỗ trợ một vài cách làm việc khác nhau.

Vấn đề của việc chia sẽ tập tin

Tất cả các hệ kiểm soát phiên bản đều phải giải quyết một vấn đề cơ bản: bằng cách nào hệ thống cho phép người dùng chia sẽ thông tin nhưng vẫn có thể ngăn không để họ giẫm chân lên nhau? Rất dễ xảy ra việc người sử dụng ghi đè lên những thay đổi của người khác trong kho lưu trữ một cách vô ý.

Xem xét kịch bản thể hiện ở Figure 1.2, “Vấn đề cần tránh”. Giả sử chúng ta có hai người đồng nghiệp, Harry và Sally. Mỗi người đều quyết định sẽ chỉnh sửa cùng một tập tin cùng thời điểm. Nếu Harry lưu những thay đổi của anh ấy vào kho lưu trữ trước, thì có nhiều khả năng là (một lát sau) Sally có thể ghi đè lên những thay đổi này với phiên bản tập tin mới hơn của cô ấy một cách vô tình. Mặc dù phiên bản của Harry sẽ không bị mất hẵn (bởi vì hệ thống ghi nhớ mỗi thay đổi), bất kỳ thay đổi nào mà Harry tạo ra sẽ không được hiện diện trong phiên bản tập tin mới hơn của Sally, bởi vì cô ấy không biết về những thay đổi của Harry để tiếp tục nối vào. Những thay đổi của Harry vẫn bị mất—hoặc ít nhất là không có mặt trong phiên bản mới nhất của tập tin—chắc chắn chỉ vì vô ý. Đó hiển nhiên là một tình huống mà chúng ta cần tránh!

Figure 1.2. Vấn đề cần tránh

Vấn đề cần tránh

Giải pháp khoá-sửa đổi-mở khoá

Nhiều hệ thống kiểm soát phiên bản sử dụng mô hình khoá-sửa đổi-mở khoá để giải quyết vấn đề nhiều tác giả đụng độ liên tục những thay đổi của nhau. Trong mô hình này, kho lưu trữ chỉ cho phép thay đổi của một người duy nhất ở một thời điểm. Chính sách độc quyền này được thực thi bằng việc sử dụng khóa. Harry cần phải khóa một tập tin trước khi anh ấy có thể bắt đầu hiệu chỉnh nó. Nếu Harry đã khóa tập tin, Sally không thể khóa nó, và như vậy là không thể tạo ra bất kỳ thay đổi nào trên tập tin đó. Tất cả những điều cô ấy có thể làm là đợi Harry hoàn thành những thay đổi của anh ấy, lưu tập tin và mở khóa. Sau khi Harry mở khóa tập tin, Sally tới lượt mình có thể khóa tập tin. Tiếp theo cô ấy có thể lấy phiên bản mới nhất của tập tin và hiệu chỉnh nó. Figure 1.3, “Giải pháp khoá-sửa đổi-mở khoá”trình bày giải pháp đơn giản này.

Figure 1.3. Giải pháp khoá-sửa đổi-mở khoá

Giải pháp khoá-sửa đổi-mở khoá

Vấn đề của mô hình khoá-sửa đổi-mở khoá này là nó hơi hạn chế và thường hay trở thành một rào cản đối với người sử dụng:

  • Khóa có thể làm phát sinh những vấn đề về quản trị. Đôi khi Harry khóa một tập tin và quên nó hoàn toàn. Trong lúc đó, bởi vì Sally vẫn đang đợi để điều chỉnh tập tin, cô ấy sẽ phải chờ đợi mỏi mòn. Sau đó Harry lại có kỳ nghỉ. Lúc này Sally phải nhờ người quản trị để mở khóa của Harry. Tình huống gây nên việc đình trệ không cần thiết và tốn thời gian.

  • Khóa có thể gây nên sự nối tiếp hóa (serialization) không cần thiết. Điều gì sẽ xảy ra nếu Harry đang chỉnh sửa phần đầu của một tập tin văn bản, và Sally muốn chỉnh sửa phần cuối của cùng tập tin? Những thay đổi này không bị chồng lên nhau. Họ có thể dễ dàng chỉnh sửa tập tin đồng thời và sẽ không có tổn hại nào xuất hiện với giả sử rằng những thay đổi được hợp nhất với nhau một cách đúng đắn. Trong tình huống này họ không cần thiết phải thay phiên nhau.

  • Khóa có thể tạo ra một cảm giác sai về bảo mật. Giả sử Harry khóa và chỉnh sửa tập tin A, trong khi đó Sally cũng khóa và chỉnh sửa tập tin B. Nhưng sẽ như thế nào nếu cả A và B phụ thuộc vào nhau và những thay đổi được thực hiện trên mỗi tập tin là không tương thích về mặt ngữ nghĩa? Đột nhiên A và B không làm việc với nhau nữa. Hệ thống khóa đã bất lực không thể ngăn vấn đề xảy ra—nó tạo nên một ấn tượng sai về bảo mật. Nó rất dễ gây cho Harry và Sally suy nghĩ rằng bằng cách khóa những tập tin, mỗi người có thể bắt đầu công việc một cách an toàn, tác vụ tách biệt nhau, và do đó họ không cần bận tâm thảo luận về những thay đổi không tương thích ngay từ đầu. Khóa đôi khi trở thành một sự thay thế cho giao tiếp thực tế.

Giải pháp sao chép-sửa đổi-hợp nhất

Subversion, CVS và nhiều hệ kiểm soát phiên bản khác sử dụng mô hình sao chép-sửa đổi-hợp nhất như là phương án thay thế cho khóa. Trong mô hình này, mỗi ứng dụng khách của người sử dụng kết nối với kho lưu trữ dự án và tạo một bản sao làm việc riêng. Người sử dụng sau đó làm việc đồng thời và độc lập với nhau chỉnh sửa phiên bản sao chép riêng của họ. Sau cùng, những bản sao riêng lẻ được hợp nhất với nhau thành một bản mới, phiên bản cuối cùng. Hệ thống kiểm soát phiên bản thường hỗ trợ việc hợp nhất, nhưng sau cùng, người quản trị có trách nhiệm thực hiện việc hợp nhất một cách chính xác.

Đây là một ví dụ. Giả sử rằng Harry và Sally mỗi người tạo một bản sao làm việc của cùng một dự án, sao chép từ kho lưu trữ. Họ làm việc đồng thời và thay đổi trên cùng một tập tin A trong bản sao của họ. Sally lưu những thay đổi của cô ấy vào kho lưu trữ trước. Khi Harry cố gắng để lưu những thay đổi của anh ấy sau đó, kho lưu trữ thông báo với anh ấy rằng tập tin A của anh ấy quá hạn. Nói cách khác, tập tin A trong kho lưu trữ đã bị thay đổi theo cách nào đó kể từ lúc anh ấy sao lưu nó. Vì vậy Harry ra lệnh cho ứng dụng khách của anh ấy hợp nhất bất kỳ thay đổi mới nào từ trên kho lưu trữ vào trong bản sao làm việc của tập tin A của anh ấy. Nhiều khả năng là những thay đổi của Sally không bị chồng chéo với những thay đổi của riêng anh ấy; khi hai phần đã được tích hợp vào với nhau, anh ấy lưu bản sao làm việc của anh ấy vào trong kho lưu trữ. Figure 1.4, “Giải pháp sao chép-sửa đổi-hợp nhất”Figure 1.5, “Giải pháp sao chép-sửa đổi-hợp nhất (tiếp theo)” biểu diễn quy trình này.

Figure 1.4. Giải pháp sao chép-sửa đổi-hợp nhất

Giải pháp sao chép-sửa đổi-hợp nhất

Figure 1.5. Giải pháp sao chép-sửa đổi-hợp nhất (tiếp theo)

Giải pháp sao chép-sửa đổi-hợp nhất (tiếp theo)

Nhưng sẽ như thế nào nếu thay đổi của Sally thật sự chồng chéo với thay đổi của Harry? Điều gì sau đó? Tình huống này gọi là xung đột, và thông thường thì nó không hẵn là một vấn đề. Khi Harry ra lệnh cho ứng dụng khách của anh ấy hợp nhất những thay đổi mới nhất trên kho vào trong bản sao làm việc của anh ấy, bản sao của tập tin A của anh ấy theo cách nào đó được đánh dấu như là đang ở trạng thái xung đột: anh ấy có thể thấy cả hai phần của những thay đổi đang gặp xung đột và chọn một trong hai một cách thủ công. Lưu ý rằng phần mềm không thể giải quyết xung đột một cách tự động; chỉ có con người mới có khả năng hiểu và thực hiện việc chọn lựa cần thiết một cách thông minh. Khi Harry đã giải quyết vấn đề những thay đổi chồng chéo một cách thủ công—có lẽ sau khi thảo luận với Sally—anh ấy có thể lưu tập tin được hợp nhất ngược lại vào trong kho lưu trữ.

Mô hình sao chép-sửa đổi-hợp nhất nghe có vẻ hơi hỗn loạn, nhưng trên thực tế, nó hoạt động rất mượt. Người sử dụng có thể làm việc song song, không bao giờ phải chờ đợi nhau. Khi họ làm việc trên cùng một tập tin, hoá ra rằng hầu hết những thay đổi đồng thời của họ không hoàn toàn không chồng lấn; xung đột là không thường xuyên. Và thời gian nó tiêu tốn để giải quyết xung đột thường là ít hơn nhiều so với thời gian bị mất bởi hệ thống khoá.

Cuối cùng, tất cả dẫn đến một yếu tố quan trọng: giao tiếp người sử dụng. Khi người dùng giao tiếp kém, cả hai loại xung đột cú pháp và xung đột ngữ nghĩa tăng. Không có hệ thống nào có thể bắt buộc người sử dụng phải giao tiếp một cách hoàn hảo, và không có hệ thống nào có thể phát hiện những xung đột ngữ nghĩa. Vì vậy, khó để bị ru ngủ vào một cảm giác sai về bảo mật rằng một hệ thống khoá bằng cách nào đó ngăn chặn xung đột; trong thực tế, khoá dường như ngăn cản năng xuất nhiều hơn bất cứ thứ gì khác.



[5] Thuật ngữ bản sao làm việc nói chung có thể được áp dụng cho bất kỳ phiên bản cục bộ nào của tập tin. Tuy nhiên, hầu hết mọi người khi sử dụng những thuật ngữ này họ đang đề cập đến toàn bộ cây thư mục chứa các tập tin và thư mục con mà được quản lý bởi hệ thống kiểm soát phiên bản.