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.

Subversion Là Gì?

Subversion là một hệ thống kiểm soát phiên bản (VCS - version control systems) mã nguồn mở. Subversion quản lý xuyên suốt tập tin, thư mục và những thay đổi trên những tập tin và thư mục này. Nó cho phép bạn phục hồi lại những phiên bản dữ liệu cũ của bạn hoặc xem xét lịch sử của việc dữ liệu của bạn được thay đổi như thế nào. Về khía cạnh này, nhiều người nghĩ hệ thống kiểm soát phiên bản như một dạng của cỗ máy thời gian.

Subversion có thể hoạt động xuyên suốt các hệ thống mạng và vì vậy nó được sử dụng bởi người dùng ở những máy tính khác nhau. Ở một vài cấp độ, việc cho phép nhiều người cùng chỉnh sửa và quản trị cùng một tập hợp dữ liệu từ những vị trí tương ứng của họ thúc đẩy việc hợp tác. Quá trình có thể xảy ra nhanh hơn mà không cần một dạng đường đi đơn lẽ thông qua đó tất cả thay đổi phải xảy ra. Và bởi vì công việc đã được đánh dấu phiên bản, bạn không cần phải lo lắng rằng chất lượng là cái giá cho việc không dùng đường đi đơn lẽ đó—nếu một vài thay đổi được thực hiện không đúng trên dữ liệu, chỉ việc hoàn tác thay đổi đó.

Một vài hệ thống kiểm soát phiên bản cũng là hệ thống quản lý cấu hình phần mềm (SCM - software configuration management). Các hệ thống này đặc biệt phù hợp với việc quản lý cây mã nguồn và có nhiều tính năng cụ thể dành cho việc phát triển phần mềm—như là hiểu ngôn ngữ lập trình, hoặc cung cấp công cụ để xây dựng phần mềm. Tuy nhiên, Subversion không phải là một hệ thống như vậy. Nó là một hệ thống mà có thể dùng để quản lý tập hợp các tập tin bất kỳ. Với bạn, những tập tin này có thể là mã nguồn—với những người khác, có thể là bất loại gì từ danh sách mua tạp hoá tới hoà trộn video kỹ thuật số và nhiều hơn nữa.

Subversion có phải là công cụ phù hợp?

Nếu bạn là người sử dụng hoặc quản trị hệ thống mà đang cân nhắc sử dụng Subversion, câu hỏi đầu tiên mà bạn nên tự hỏi mình là: "Đây có phải là công cụ phù hợp cho công việc hay không?" Subversion là một cái búa tuyệt vời, nhưng hãy cẩn thận đừng xem tất cả các vấn đề như một móng tay.

Như bước khởi đầu, bạn cần quyết định nếu kiểm soát phiên bản nói chung là cần thiết cho các mục đích của bạn. Nếu bạn cần lưu trữ những phiên bản cũ của tập tin và thư mục, có nhu cầu phục hồi chúng, và kiểm tra các bản ghi nhật ký để xem chúng được thay đổi như thế nào xuyên suốt thời gian thì kiểm soát phiên bản có thể làm được. Nếu bạn cần hợp tác với nhiều người trên những tài liệu (thông thường là trên hệ thống mạng) và theo dõi việc ai thay đổi những gì, kiểm soát phiên bản cũng có thể làm được. Trên thực tế, đó là lý do vì sao những công cụ kiểm soát phiên bản như là Subversion thường được sử dụng trong môi trường phát triển phần mềm—làm việc trong một nhóm phát triển vốn là một hoạt động xã hội nơi mà việc thay đổi trên tập tin mã nguồn liên tục được thảo luận, thực hiện, đánh giá, và kể cả đôi khi phá bỏ. Những công cụ kiểm soát phiên bản tạo điều kiện cho loại hợp tác này.

Việc sử dụng kiểm soát phiên bản tất nhiên cũng có một số hạn chế. Trừ khi bạn có thể thuê ngoài việc quản trị hệ thống kiểm soát phiên bản của bạn cho bên-thứ-ba, việc tự bạn quản lý hệ thống vẫn có một số mặt hạn chế. Khi làm việc với dữ liệu trên cơ sở hàng ngày, bạn không thể sao chép, di chuyển, đổi tên hoặc xoá tập tin theo cách mà bạn thường làm. Thay vào đó, bạn sẽ phải thực hiện tất cả những việc đó thông qua hệ thống kiểm soát phiên bản.

Ngay cả giả sử rằng bạn hài lòng với sự cân bằng về mặt hạn-chế/lợi-ích mà hệ thống kiểm soát phiên bản mang lại, bạn cũng không nên chọn sử dụng chỉ đơn thuần bởi vì nó có thể làm được những gì bạn muốn. Nên cân nhắc nhu cầu của bạn có thể được giải quyết bằng các công cụ khác. Ví dụ, bởi vì Subversion sao chép dữ liệu đến tất cả các cộng tác viên liên quan, một sự lạm dụng phổ biến đó là xem nó như một hệ thống phân phối. Đôi khi người ta sử dụng Subversion để phân phối những bộ sưu tập lớn hình ảnh, âm nhạc kỹ thuật số, hoặc những gói phần mềm. Vấn đề là tất cả những loại dữ liệu này thường không thay đổi. Bản thân bộ sưu phồng lên theo thời gian, nhưng những tập tin riêng lẽ trong bộ sưu tập thì không thay đổi. Trong trường hợp này, việc sử dụng Subversion là quá mức cần thiết.[2] Có nhiều công cụ đơn giản hơn để sao chép dữ liệu một cách hiệu quả mà không tốn thêm chi phí với phần theo dõi những thay đổi, ví dụ như rsync hoặc unison.

Một khi bạn đã quyết định rằng bạn cần một giải pháp kiểm soát phiên bản, bạn sẽ tìm thấy không thiếu những lựa chọn có sẵn. Ở thời điểm khi Subversion lần đầu được thiết kế và phân phối, phương pháp thống trị của kiểm soát phiên bản là kiểm soát phiên bản tập trung hoá—một tổng kho đơn từ xa chứa dữ liệu phiên bản với người dùng cá nhân làm việc cục bộ trên bản sao cạn (shallow copy) lịch sử phiên bản của dữ liệu. Subversion nhanh chóng nổi lên sau lần giới thiệu ban đầu như là một tiên phong trong lĩnh vực kiểm soát phiên bản, được tiếp nhận một cách rộng rãi và là giải pháp thay thế cho nhiều hệ thống kiểm soát phiên bản cũ hơn. Ngày nay nó tiếp tục nắm giữ vị trí nổi bật.

Tuy nhiên, đã có nhiều thay đổi kể từ đó. Trong những năm kể từ thời điểm dự án Subversion bắt đầu vòng đời của nó, một phương pháp kiểm soát phiên bản mới được gọi là kiểm soát phiên bản phân tán đã tương tự như vậy thu hút được sự chú ý và chấp nhận rộng rãi. Những công cụ như là Git (http://git-scm.com/) và Mercurial (http://mercurial.selenic.com/) đã nổi lên trên đỉnh xếp hạng của hệ thống kiểm soát phiên bản phân tán (DVCS). Hệ thống kiểm soát phiên bản phân tán khai thác sự phát triển phổ biến của kết nối mạng tốc độ cao và chi phí lưu trữ thấp để cung cấp một cách tiếp cận khác với mô hình tập trung ở những điểm chính. Trước tiên và rõ ràng nhất đó là thực tế không có tổng kho trung tâm của dữ liệu được đánh dấu phiên bản. Thay vào đó, mỗi người dùng lưu giữ và vận hành một phiên bản cục bộ đầy đủ—đầy đủ, theo một nghĩa nào đó—về lịch sử lưu trữ dữ liệu. Việc hợp tác vẫn xảy ra, nhưng được thực hiện thông qua việc trao đổi tập của những thay đổi được tạo trực tiếp giữa những bản dữ liệu lưu trữ cục bộ của người dùng, không phải thông qua lưu trữ dữ liệu tổng thể tập trung. Trên thực tế, bất kỳ hình thái nào của dữ liệu phiên bản của bộ dữ liệu của dự án chỉ là theo quy ước, một trạng thái được quy gán bởi các cộng tác viên khác nhau trong dự án đó.

Với mỗi hướng tiếp cập của kiểm soát phiên bản tồn tại những ưu và khuyết điểm. Có lẽ hai lợi ích lớn nhất được cung cấp bởi các công cụ DVCS là hiệu suất đáng kinh ngạc cho hoạt động hàng ngày (bởi vì dữ liệu chính được lưu trữ cục bộ) và hỗ trợ tốt hơn một cách rộng rãi cho việc hợp nhất giữa các nhánh (vì thuật toán hợp nhất đóng vai trò cốt lõi trong cách DVCS làm việc). Nhược điểm là kiểm soát phiên bản phân tán vốn là một mô hình phức tạp hơn, mà có thể hiện hữu một thách thức đáng kể ảnh hưởng tới tính tiện lợi của việc cộng tác. Ngoài ra, công cụ DVCS làm rất tốt cũng một phần vì một mức độ nhất định của kiểm soát nằm ở phía người dùng mà về cơ bản hệ thống tập trung cung cấp—khả năng thực hiện việc kiểm soát truy cập dựa trên đường dẫn, tính linh hoạt để có thể cập nhật hoặc huỷ cập nhật những mục dữ liệu phiên bản riêng lẻ, vv. May mắn thay, nhiều tổ chức sáng suốt đã phát hiện ra rằng điều này không cần phải là một cuộc tranh luận tôn giáo, công cụ Subversion và DVCS như là Git có thể sử dụng chung với nhau một cách hài hoà trong tổ chức, mỗi công cụ phục vụ cho một mục đích riêng phù hợp với nó.

Cuốn sách này là về Subversion, vì vậy chúng tôi sẽ không cố gắng làm một so sánh đầy đủ của Subversion và các công cụ khác. Độc giả được trao quyền để lựa chọn hệ thống kiểm soát phiên bản của họ và được khuyến khích nghiên cứu các tùy chọn có sẵn để có lựa chọn phù hợp nhất cho bản thân và cộng tác viên của họ. Và nếu sau khi ra quyết định, Subversion được chọn, có nhiều thông tin chi tiết về cách làm thế nào để sử dụng nó một cách thành công trong các chương tiếp theo!

Lịch sử Subversion

Trong những năm đầu 2000, CollabNet, Inc. (http://www.collab.net) bắt đầu chiêu mộ nhiều lập trình viên để xây dựng một bản thay thế cho CVS. CollabNet cung cấp[3] một bộ phần mềm cộng tác gọi là CollabNet Enterprise Edition (CEE), trong đó có một thành phần là kiểm soát phiên bản. Mặc dù ban đầu CEE dùng CVS làm hệ thống kiểm soát văn bản, những giới hạn của CVS là rõ ràng ngay từ ban đầu, và CollabNet biết là họ cuối cùng cần phải tìm một cái gì đó tốt hơn. Không may là CVS trên thực tế đã trở thành tiêu chuẩn trong phần lớn thế giới mã nguồn mở bởi vì không có cái nào tốt hơn, ít nhất là theo một giấy phép miễn phí. Vì vậy CollabNet đã quyết định xây dựng một hệ thống kiểm soát phiên bản mới hoàn toàn, giữ lại những ý tưởng cơ bản của CVS nhưng không có lỗi và bổ sung những tính năng còn thiếu.

Vào tháng 2 năm 2000, họ liên lạc với Karl Fogel là tác giả của Phát Triển Mã Nguồn Mở với CVS (Coriolis, 1999) và đề nghị ông tham gia vào dự án. Thật trùng hợp, lúc đó Karl đang thảo luận với bạn của mình Jim Blandy về việc thiết kế một hệ thống kiểm soát phiên bản mới. Trong năm 1995, cả hai đã mở công ty Cyclic Software là công ty chuyên cung cấp hợp đồng hỗ trợ CVS, và mặc dù sau đó đã bán công ty nhưng họ vẫn sử dụng CVS để làm việc hàng ngày. Sự thất vọng của họ với CVS đã khiến Jim phải suy nghĩ cẩn thận về những cách tốt hơn để kiểm soát dữ liệu phiên bản và ông đã không chỉ nghĩ ra cái tên Subversion mà còn xây dựng được những thiết kế cơ bản của dữ liệu lưu trữ Subversion. Khi CollabNet liên hệ, Karl ngay lập tức đồng ý tham gia vào dự án, và Jim có được chủ nhân của mình, Công ty Phần mềm Red Hat, để về cơ bản cống hiến cho dự án vô thời hạn. CollabNet thuê Karl và Ben Collins-Susman và việc thiết kế chi tiết đã bắt đầu vào tháng Ba năm 2000. Với sự giúp đỡ từ Brian Behlendorf và Jason Robbins của CollabNet, và từ Greg Stein (lúc đó là một nhà phát triển tự do chuyên về quy trình đặc điểm kỹ thuật WebDAV/DeltaV), Subversion nhanh chóng thu hút được một cộng đồng những nhà phát triển tích cực. Hoá ra có rất nhiều người có trải nghiệm thất vọng với CVS và họ hoan nghênh cơ hội để cuối cùng làm gì đó để giải quyết việc này.

Nhóm thiết kế ban đầu thiết lập một số mục tiêu. Họ không muốn thiết lập một tiêu chuẩn mới trong phương pháp kiểm soát phiên bản, họ chỉ muốn sửa CVS. Họ quyết định rằng Subversion sẽ đồng nhất với CVS về mặt tính năng và bảo tồn y nguyên mô hình phát triển, nhưng không lặp lại những lỗi quá rõ ràng của CVS. Và mặc dù nó không cần phải là một sự thay thế cho CVS, nó nên giống vừa đủ để bất kỳ người dùng nào cũng có thể thực hiện chuyển đổi với rất ít nỗ lực.

Sau 14 tháng lập trình, Subversion bắt đầu tự-lưu-trữ vào ngày 31 tháng 8 năm 2001. Đó là, các nhà phát triển Subversion ngừng sử dụng CVS để quản lý mã nguồn riêng của Subversion và bắt đầu sử dụng Subversion để thay thế.

Trong lúc CollabNet bắt đầu dự án và vẫn đang đóng góp một phần lớn công việc (trả lương cho một số lập trình viên Subversion làm việc toàn thời gian), Subversion được duy trì như đa số những dự án mã nguồn mở khác, quản lý bởi một tập hợp lỏng lẻo, các quy tắc minh bạch nhằm khuyến khích nhân tài. Trong năm 2009, CollabNet đã làm việc với những nhà phát triển Subversion hướng tới mục tiêu tích hợp dự án Subversion vào Quỹ Phần mềm Apache (ASF - Apache Software Foundation), một trong những tập thể nổi tiếng nhất trên thế giới của dự án mã nguồn mở. Kỹ thuật gốc của Subversion, hướng đến cộng đồng và thực tiễn phát triển là phù hợp hoàn hảo với ASF, nhiều người trong số các thành viên đã là những người đóng góp tích cực vào Subversion. Vào đầu năm 2010, Subversion được tiếp nhận hoàn toàn vào danh sách những dự án quan trọng của ASF, chuyển địa chỉ website của dự án tới http://subversion.apache.org và được đặt lại tên là Apache Subversion.

Kiến trúc Subversion

Figure 1, “Kiến trúc Subversion” minh hoạ mile-high thiết kế của Subversion.

Figure 1. Kiến trúc Subversion

Kiến trúc Subversion

Ở một phía là kho lưu trữ Subversion lưu giữ toàn bộ dữ liệu phiên bản của bạn. Ở phía còn lại là ứng dụng khách quản lý cục bộ phần phản xạ của những phần dữ liệu phiên bản. Giữa hai cực đó là rất nhiều tuyến đường xuyên qua một lớp Quyền Truy Cập Kho Lưu Trữ (RA - Repository Access), một số trong đó thông qua mạng máy tính kết nối vào các máy chủ mạng mà sau đó truy cập vào kho lưu trữ, số khác bỏ qua mạng hoàn toàn và truy cập trực tiếp vào kho lưu trữ.

Thành phần Subversion

Subversion, sau khi cài đặt, có một số phần khác nhau. Sau đây là tổng quan của những gì bạn nhận được. Đừng lo lắng nếu phần mô tả làm cho bạn phải gãi đầu—rất nhiều trang trong cuốn sách này được dành để làm giảm bớt sự rối rắm này.

svn

Ứng dụng khách Subversion giao-diện-dòng-lệnh

svnversion

Chương trình để báo cáo tình trạng (về các phiên bản của những mục hiện hữu) của một bản sao làm việc (working copy)

svnlook

Công cụ để kiểm tra kho lưu trữ Subversion

svnadmin

Công cụ để tạo, chỉnh, hoặc sửa chữa kho lưu trữ Subversion

mod_dav_svn

Thành phần plug-in dành cho Apache HTTP Server, được sử dụng để làm cho kho lưu trữ của bạn có sẵn cho những người khác trong một mạng lưới

svnserve

Chương trình tuỳ biến độc lập chạy trên máy chủ, có thể được thực thi như là một tiến trình daemon hoặc kích hoạt thông qua SSH; một cách khác để làm cho kho lưu trữ của bạn có sẵn cho những người khác trong một mạng lưới

svndumpfilter

Chương trình để lọc những luồng kết xuất của kho lưu trữ Subversion

svnsync

Chương trình để đồng bộ từng bước một kho lưu trữ sang một kho khác trong một mạng lưới

svnrdump

Chương trình để thực hiện việc kết xuất và nạp lịch sử của kho lưu trữ trong một mạng lưới

svnmucc

Một chương trình để thực hiện nhiều thao tác kho lưu trữ dựa-trên-URL trong một lần chuyển giao (commit) và không cần bản sao làm việc (working copy)

Có gì mới trong Subversion

Ấn bản đầu tiên của cuốn sách này được phát hành bởi O'Reilly Media vào năm 2004, ngay sau khi Subversion hoàn thành phiên bản 1.0. Kể từ đó, dự án Subversion tiếp tục phát hành phiên bản chính mới của phần mềm. Đây là bản tóm tắt của những thay đổi chính kể từ Subversion 1.0. Lưu ý rằng đây không phải là một danh sách hoàn chỉnh; để có đầy đủ thông tin chi tiết, vui lòng truy cập website của Subversion tại địa chỉ http://subversion.apache.org.

Subversion 1.1 (Tháng Chín 2004)

Bản phát hành 1.1 giới thiệu FSFS, một tuỳ chọn lưu trữ dạng tập tin. Trong khi Berkeley DB bên dưới vẫn được sử dụng và hỗ trợ một cách rộng rãi, FSFS kể từ đó trở thành sự lựa chọn mặc nhiên cho việc tạo kho lưu trữ do dễ triển khai và yêu cầu bảo trì tối thiểu. Bản phát hành này còn cung cấp khả năng cho phép đặt liên kết tượng trưng (symlink) vào kiểm soát phiên bản, tự động mã hoá URL và giao diện người dùng địa phương hoá.

Subversion 1.2 (Tháng Năm 2005)

Bản phát hành 1.2 giới thiệu khả năng tạo khoá phía máy chủ trên các tập tin, do đó tuần tự hoá việc chuyển giao vào những tài nguyên cụ thể. Trong khi Subversion vẫn cơ bản là một hệ thống kiểm soát phiên bản đồng thời, một vài loại tập tin nhị phân (ví dụ. tập tin hình ảnh) không thể được trộn chung. Chức năng khoá đáp ứng nhu cầu đánh phiên bản và bảo vệ loại tài nguyên này. Cùng với chức năng khoá, bản phát hành này còn đi kèm với việc tích hợp tự-động-đánh-phiên-bản WebDAV một cách toàn diện, cho phép kho lưu trữ Subversion có thể được ánh xạ như là một thư mục mạng lưới. Cuối cùng, Subversion 1.2 bắt đầu sử dụng thuật toán binary-differencing mới và nhanh hơn để nén và truy xuất phiên bản cũ của những tập tin.

Subversion 1.3 (Tháng Mười Hai 2005)

Bản phát hành 1.3 mang chức năng kiểm soát uỷ quyền theo đường dẫn vào máy chủ svnserve, đồng nhất với tính năng mà trước đó chỉ có trên máy chủ Apache. Tuy nhiên, máy chủ Apache đã đạt được một vài tính năng ghi nhật ký của riêng nó và API của Subversion kết hợp với các ngôn ngữ khác cũng đã có bước nhảy vọt về phía trước.

Subversion 1.4 (Tháng Chín 2006)

Bản phát hành 1.4 giới thiệu một tính năng hoàn toàn mới—svnsync—để thực hiện việc sao chép một chiều kho lưu trữ trong một mạng lưới. Nhiều phần chính của siêu dữ liệu của bản sao làm việc được tân trang để không còn sử dụng XML (kết quả là tăng tốc độ phía ứng dụng khách), trong khi kho lưu trữ Barkeley DB bên dưới đã đạt được khả năng tự phục hồi chính nó sau khi một máy chủ gặp sự cố.

Subversion 1.5 (Tháng Sáu 2008)

Bản phát hành 1.5 mất nhiều thời gian hơn để hoàn thành so với các phiên bản khác, nhưng tính năng mở đầu là rất ấn tượng: theo dõi các phân nhánh và hợp nhất một cách bán tự động. Đó là một lợi ích lớn cho người sử dụng và đã nâng Subversion cao hơn rất nhiều so với khả năng của CVS và vào trong nhóm của những đối thủ cạnh tranh thương mại như là Perfoce và ClearCase. Subversion 1.5 cũng giới thiệu một loạt những tính năng khác hướng tới người dùng như là tương tác giải quyết xung đột tập tin, kiểm xuất rời rạc, quản lý danh sách thay đổi ở phía khách, cú pháp mới mạnh mẽ cho mục bên ngoài và hỗ trợ xác thực SASL cho máy chủ svnserve

Subversion 1.6 (Tháng Ba 2009)

Bản phát hành 1.6 tiếp tục nâng cấp mạnh mẽ hơn chức năng phân nhánh và hợp nhất với việc giới thiệu cây xung đột và cung cấp cải tiến cho một loạt những tính năng đã có: nhiều tuỳ chọn giải quyết xung đột tương tác; tách và loại trừ hoàn toàn sự hỗ trợ cho kiểm xuất rời rạc; mục bên ngoài dựa trên tập tin; và hỗ trợ ghi nhật ký hoạt động cho svnserve tương tự như những gì mod_dav_svn đã có. Ứng dụng khách Subversion giao-diện-dòng-lệnh cũng giới thiệu một cú pháp phím tắt mới để tham chiếu tới URL của kho lưu trữ.

Subversion 1.7 (Tháng Mười 2011)

Bản phát hành 1.7 chủ yếu phân phối hai bản sửa chữa lớn của những thành phần Subversion đã tồn tại. Mục lớn nhất và có ảnh hưởng lớn nhất có tên WC-NG—là bản viết lại hoàn toàn của thư viện quản lý bản sao làm việc libsvn_wc. Mục thay đổi thứ hai là sự giới thiệu của một giao thức HTTP bóng bảy hơn cho giao tiếp chủ/khách Subversion. Subversion 1.7 cũng phân phối một vài tính năng khác, sửa nhiều lỗi và một vài cải tiến đáng ghi nhận về mặt hiệu năng.

Subversion 1.8 (Tháng Sáu 2013)

Trong bản phát hành 1.8, ứng dụng khách Subversion giờ đây theo dõi việc đổi tên tập tin và thư mục một cách triệt để, và lệnh svn merge của nó đã thông minh hơn làm cho tuỳ chọn --reintegrate không còn cần thiết. Một vài giá trị thuộc tính phiên bản mới có thể được kế thừa từ thư mục cha. Tính năng đó giờ đây cho phép một kho lưu trữ đọc giá trị mặc định cho các thiết lập thuộc tính tự động và mẫu tập tin có thể bỏ qua, mang lại sự nhất quán xuyên suốt cơ sở người dùng của kho lưu trữ đó theo cách mà trước đây cần phải được quản lý thủ công bởi người dùng của kho lưu trữ. Ngoài ra cũng có một lệnh kiểu dòng lệnh mới là công cụ hợp nhất tập tin để giải quyết xung đột tương tác. Như mọi khi, Subversion phiên bản 1.8 bao gồm nhiều tính năng bổ sung, sửa chữa khiếm khuyết và cải tiến về mặt hiệu năng và hành vi.



[2] Hoặc như một người bạn ví von, chém ruồi bằng dao phay.

[3] CollabNet Enterprise Edition sau đó được thay thế bởi một dòng sản phẩm mới gọi là CollabNet TeamForge.