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.

Kiểm Soát Phiên Bản Theo Cách Của Subversion

Chúng tôi đã đề cập rằng Subversion là một hệ thống kiểm soát phiên bản hiện đại, thiết kế cho mạng lưới. Như chúng tôi có mô tả trong the section called “Căn Bản Kiểm Soát Phiên Bản” (tổng quan về kiểm soát phiên bản ở cấp độ cao), kho lưu trữ đóng vai trò cơ chế lưu trữ trung tâm cho dữ liệu phiên bản của Subversion, và thông qua bản sao làm việc mà người sử dụng và phần mềm của họ tương tác với dữ liệu đó. Trong phần này, chúng ta sẽ bắt đầu giới thiệu những cách cụ thể mà Subversion thực hiện kiểm soát phiên bản.

Kho lưu trữ Subversion

Subversion hiện thực khái niệm kho lưu trữ của kiểm soát phiên bản tương tự như những hệ thống kiểm soát phiên bản hiện đại khác. Không giống như bản sao làm việc, kho lưu trữ Subversion là một thực thể trừu tượng, có khả năng được vận hành gần như độc quyền bởi những thư viện và công cụ riêng của Subversion. Vì đa số những tương tác Subversion của người sử dụng có liên quan đến việc sử dụng ứng dụng khách Subversion và xảy ra trong phạm vi của bản sao làm việc, chúng ta sẽ dành phần lớn trong cuốn sách này thảo luận về bản sao làm việc Subversion và làm cách nào để thao tác trên nó. Để có thông tin chi tiết hơn về kho lưu trữ, kiểm tra Chapter 5, Repository Administration.

[Warning] Warning

Trong Subversion, đối tượng phía máy khách mà mỗi người sử dụng của hệ thống đều có—thư mục chứa những tập tin phiên bản, đi kèm với siêu dữ liệu mà cho phép hệ thống theo dõi chúng và giao tiếp với máy chủ—gọi là bản sao làm việc. Mặc dù những hệ thống kiểm soát phiên bản khác sử dụng khái niệm kho lưu trữ cho đối tượng phía máy khách, cả hai đều không chính xác và là nguồn gốc gây nhầm lẫn phổ biến của việc sử dụng thuật ngữ theo cách này trong ngữ cảnh của Subversion.

Bản sao làm việc được mô tả sau trong the section called “Bản sao làm việc Subversion”.

Phiên bản

Ứng dụng khách Subversion chuyển giao (đó là, truyền những thay đổi được thực hiện) số lượng tập tin và thư mục bất kỳ bởi một giao dịch đơn nguyên tử. Khi đề cập đến giao dịch nguyên tử, chúng tôi đơn giản muốn thể hiện là: hoặc là tất cả các thay đổi được chấp nhận vào trong kho lưu trữ, hoặc không có bất kỳ thay đổi nào. Subversion sẽ cố gắng để giữ lại tính nguyên tử này trong những tình huống chương trình bị treo, hệ thống treo, vấn đề về mạng, và hành động của người dùng khác.

Mỗi khi kho lưu trữ tiếp nhận một chuyển giao (commit), việc này tạo nên một trạng thái mới của cây hệ thống tập tin, được gọi là phiên bản. Mỗi phiên bản được gán một số tự nhiên không trùng lặp, mỗi số sẽ lớn hơn số được gán cho phiên bản kế trước. Phiên bản ban đầu của một kho lưu trữ vừa tạo được đánh số 0 và nó chỉ là một thư mục gốc rỗng.

Figure 1.6, “Cây thay đổi theo thời gian” minh hoạ một cách đơn giản để hình dung kho lưu trữ. Tưởng tượng có một dãy của những số phiên bản, bắt đầu từ 0, kéo dài từ trái sang phải. Mỗi số phiên bản có một cây hệ thống tập tin treo dưới nó và mỗi cây là một ảnh chụp của cách kho lưu trữ làm việc sau mỗi chuyển giao.

Figure 1.6. Cây thay đổi theo thời gian

Cây thay đổi theo thời gian

Địa chỉ kho lưu trữ

Ứng dụng khách Subversion dùng URL để xác định những tập tin và thư mục đã được đánh phiên bản trong kho lưu trữ Subversion. Hầu hết những URL này sử dụng cú pháp chuẩn, cho phép tên máy chủ và cổng được xác định như một phần của URL.

  • http://svn.example.com/svn/project
  • http://svn.example.com:9834/repos

URL của kho lưu trữ Subversion không chỉ giới hạn với http://. Bởi vì Subversion cung cấp nhiều phương thức khác nhau để những ứng dụng khách của nó có thể giao tiếp với máy chủ, URL được dùng để xác định địa chỉ của kho khác biệt một chút tùy thuộc vào cơ chế truy cập kho mà nó sử dụng. Table 1.1, “URL truy cập kho lưu trữ” miêu tả những lược đồ URL khác nhau ánh xạ vào những phương thức truy cập kho lưu trữ có sẵn. Để biết thêm chi tiết về các tùy chọn máy chủ Subversion, xem Chapter 6, Server Configuration.

Table 1.1. URL truy cập kho lưu trữ

Giao thức Phương thức truy cập
file:/// Truy cập trực tiếp kho lưu trữ (trên đĩa cục bộ)
http:// Truy cập thông qua giao thức WebDAV tới máy chủ Apache Subversion
https:// Tương tự như http://, nhưng với đóng gói SSL (mã hóa và xác thực)
svn:// Truy cập thông qua giao thức tùy chỉnh tới máy chủ svnserve
svn+ssh:// Tương tự như svn://, nhưng thông qua SSH

Việc xử lý URL của Subversion có một số điểm đáng chú ý. Ví dụ: URL chứa phương thức truy cập file:// (được sử dụng cho kho lưu trữ cục bộ) để phù hợp với quy ước cần phải có hoặc tên máy chủ localhost hoặc hoàn toàn không chứa tên máy chủ:

  • file:///var/svn/repos
  • file://localhost/var/svn/repos

Ngoài ra, những người sử dụng giao thức file:// trên nền tảng Windows sẽ cần phải sử dụng một cú pháp chuẩn không chính thức để truy cập kho lưu trữ ở trên cùng một máy nhưng khác ổ đĩa với ổ đĩa của thư mục làm việc. Cả hai cú pháp đường dẫn URL bên dưới sẽ hoạt động, với X là ổ đĩa mà kho lưu trữ được chứa trong:

  • file:///X:/var/svn/repos
  • file:///X|/var/svn/repos

Lưu ý rằng URL sử dụng dấu gạch chéo xuôi mặc dù dạng đường dẫn gốc (không-URL) trên Windows sử dụng dấu gạch chéo ngược. Ngoài ra cũng lưu ý khi sử dụng dạng file:///X|/ ở giao diện dòng lệnh, bạn cần phải trích dẫn URL (bao quanh bằng dấu ngoặc kép) để ký tự thanh đứng không bị thông dịch như ký tự đường ống.

[Note] Note

Bạn không thể sử dụng URL file:// của Subversion với trình duyệt web thông thường theo cách mà bạn thường sử dụng. Khi bạn cố xem URL file:// trên một trình duyệt web thông thường, nó đọc và hiển thị nội dung của tập tin ở vị trí đó bằng cách kiểm tra trực tiếp hệ thống tập tin. Tuy nhiên, tài nguyên Subversion tồn tại trên một hệ thống tập tin ảo (xem the section called “Repository Layer”) và trình duyệt của bạn sẽ không hiểu làm cách nào để tương tác với hệ thống tập tin đó.

Ứng dụng khách Subversion sẽ mã hóa URL một cách tự động giống như cách mà trình duyệt web thực hiện. Lấy ví dụ, URL http://host/path with space/project/españa — mà chứa cả khoảng trắng và ký tự ASCII in hoa — sẽ được Subversion tự động thông dịch giống như khi bạn nhập http://host/path%20with%20space/project/espa%C3%B1a. Nếu URL chứa khoảng trắng, hãy nhớ đặt nó vào trong dấu ngoặc kép khi sử dụng ở giao diện dòng lệnh để Shell của bạn xử lý toàn bộ như là một tham số duy nhất cho chương trình.

Có một ngoại lệ đáng chú ý trong cách Subversion quản lý URL mà cũng được áp dụng trong cách nó quản lý đường dẫn cục bộ trong nhiều ngữ cảnh. Nếu thành phần cuối cùng của URL hoặc đường dẫn cục bộ chứa dấu a-còng (@), bạn cần phải sử dụng một cú pháp đặc biệt—được mô tả trong the section called “Peg and Operative Revisions”— để có thể làm cho Subversion định địa chỉ tài nguyên đó một cách bình thường.

Trong Subversion 1.6, một ký hiệu mũ (^) được giới thiệu như là một ký hiệu viết tắt cho URL của thư mục gốc của kho lưu trữ. Ví dụ, bạn có thể sử dụng ^/tags/bigsandwich/ để tham khảo đến URL của thư mục /tags/bigsandwich ở gốc của kho lưu trữ. Loại URL này được gọi là URL tương đối của kho lưu trữ. Lưu ý rằng cú pháp URL này chỉ hoạt động khi thư mục làm việc hiện hành của bạn là bản sao làm việc—ứng dụng khách Subversion giao-diện-dòng-lệnh nhận biết URL gốc của kho lưu trữ bằng cách tham khảo siêu dữ liệu của bản sao làm việc. Ngoài ra cũng lưu ý rằng khi bạn mong muốn tham khảo đến thư mục gốc của kho lưu trữ, bạn cần phải dùng ^/ (với dấu gạch chéo ở đuôi), không chỉ đơn thuần ^. Người sử dụng Windows cần phải lưu ý rằng dấu mũ là một ký tự thoát (escape character). Vì thể, dùng dấu mũ đôi ^^ nếu bạn sử dụng ứng dụng khách Subversion trên máy chạy Windows.

Bản sao làm việc Subversion

Một bản sao làm việc Subversion là một cây thư mục bình thường trong hệ thống cục bộ của bạn, nó chứa một bộ sưu tập tập những tập tin. Bạn có thể hiệu chỉnh những tập tin này tùy ý và nếu chúng là những tập tin mã nguồn, bạn có thể biên dịch chương trình của bạn từ những tập tin này theo cách thông thường. Bản sao làm việc của bạn là khu vực làm việc của riêng bạn: Subversion sẽ không bao giờ kết hợp thay đổi của những người khác và cũng không làm cho những thay đổi của riêng bạn có sẵn đối với những người khác, cho tới khi bạn yêu cầu nó làm việc đó một cách rõ ràng. Bạn thậm chí có thể có nhiều hơn một bản sao làm việc của cùng một dự án.

Sau khi bạn thực hiện một số thay đổi trên những tập tin trong bản sao làm việc của bạn và đã xác nhận rằng chúng hoạt động bình thường, Subversion cung cấp lệnh để bạn phát hành những thay đổi của bạn (bằng cách ghi vào kho lưu trữ), bằng cách đó làm cho chúng có sẵn với những người khác đang làm việc với bạn trong dự án. Nếu những người khác phát hành những thay đổi của riêng họ, Subversion cung cấp lệnh để hợp nhất những thay đổi đó vào trong bản sao làm việc của riêng bạn (bằng cách đọc từ kho lưu trữ). Lưu ý rằng trong Subversion, kho lưu trữ trung tâm là trung gian cho tất cả những thay đổi của tất cả mọi người—những thay đổi không được chuyển trực tiếp từ bản sao làm việc này tới bản sao làm việc khác trong các quy trình làm việc điển hình.

Bản sao làm việc cũng lưu trữ một vài tập tin phụ, được tạo ra và duy trì bởi Subversion, để hỗ trợ thực hiện các lệnh. Đặc biệt, mỗi bản sao làm việc chứa một thư mục con với tên .svn, được biết như là thư mục quản trị của bản sao làm việc. Những tập tin trong thư mục quản trị này hỗ trợ Subversion nhận diện được những tập tin được đánh phiên bản nào chứa những thay đổi chưa được phát hành, và những tập tin nào là quá hạn so với công việc của những người khác.

[Note] Note

Trước phiên bản 1.7, Subversion duy trì thư mục quản trị con .svn trong mỗi thư mục được đánh phiên bản trong bản sao làm việc của bạn. Subversion 1.7 cung cấp một cách tiếp cận hoàn toàn mới về cách siêu dữ liệu được lưu trữ và duy trì, và trọng yếu trong những thay đổi hiện hữu trong cách tiếp cận này là mỗi bản sao làm việc chỉ có duy nhất một thư mực con .svn là thư mục con trực tiếp của gốc của bản sao làm việc đó.

Bản sao làm việc hoạt động như thế nào

Với mỗi tập tin trong thư mục làm việc, Subversion ghi nhận hai loại thông tin (trong số những thông tin khác) quan trọng:

  • Tập tin đang làm việc dựa trên phiên bản nào (được gọi là phiên bản làm việc của tập tin)

  • Dấu thời gian ghi nhận lần cuối bản sao cục bộ được cập nhật từ kho lư trữ

Tiếp nhận được thông tin này, bằng cách giao tiếp với kho lưu trữ, Subversion có thể cho biết trạng thái của một tập tin làm việc thuộc trạng thái nào trong bốn trạng thái bên dưới:

Không thay đổi, và hiện hành

Tập tin trong thư mục làm việc không bị thay đổi, không có thay đổi nào trong tập tin đó được chuyển giao vào kho lưu trữ kể từ phiên bản làm việc của nó. Thực thi lệnh svn commit trên tập tin sẽ không trả về kết quả nào, và thực thi lệnh svn update cũng sẽ không trả về kết quả nào.

Được thay đổi cục bộ, và hiện hành

Tập tin được thay đổi trong thư mục làm việc, không có thay đổi nào trong tập tin đó được chuyển giao vào kho lưu trữ kể từ lần cuối bạn cập nhật. Một số thay đổi cục bộ chưa được chuyển giao vào kho lưu trữ; vì vậy thực thi lệnh svn commit trên tập tin sẽ phát hành thành công những thay đổi của bạn, và thực thi lệnh svn update trên tập tin sẽ không trả về kết quả nào.

Không thay đổi, và quá hạn

Tập tin không được thay đổi trong thư mục làm việc nhưng nó được thay đổi trên kho lưu trữ. Tập tin cuối cùng sẽ được cập nhật để làm nó hiện hành với phiên bản công khai mới nhất. Thực thi lệnh svn commit trên tập tin sẽ không trả về kết quả nào, và thực thi lệnh svn update trên tập tin sẽ trộn những thay đổi mới nhất vào trong bản sao làm việc của bạn.

Được thay đổi cục bộ, và quá hạn

Tập tin được thay đổi cả trong thư mục làm việc và trong kho lưu trữ. Thực thi lệnh svn commit trên tập tin sẽ thất bại với lỗi quá-hạn. Tập tin cần phải được cập nhật trước; lệnh svn update sẽ cố gắng để hợp nhất những thay đổi công khai với những thay đổi cục bộ. Nếu Subversion không thể hoàn thành việc hợp nhất tự động một cách hợp lý, người dùng có thể tự giải quyết xung đột.

Tương tác cơ bản trên bảo sao làm việc

Một kho lưu trữ Subversion điển hình thường chứa những tập tin (hoặc mã nguồn) của nhiều dự án; thông thường, mỗi dự án là một thư mục con trong cây hệ thống tập tin. Theo cách sắp xếp này, bản sao làm việc của người dùng sẽ thông thường tương ứng với một cây con cụ thể của kho lưu trữ.

Ví dụ, giả sử bạn có một kho lưu trữ mà chứa hai dự án phần mềm, paintcalc. Mỗi dự án được bố trí trong cấp cao nhất của thư mục con riêng của dự án như được trình bày trong hình Figure 1.7, “Hệ thống tập tin của kho lưu trữ”.

Figure 1.7. Hệ thống tập tin của kho lưu trữ

Hệ thống tập tin của kho lưu trữ

Để tạo một bản sao làm việc, bạn cần phải kiểm xuất một số cây con của kho lưu trữ. (Khái niệm kiểm xuất nghe có vẻ như nó có liên quan tới khóa hoặc đặt trước nguồn lực, tuy nhiên nó không phải như vậy; nó đơn giản chỉ tạo cho bạn một bản sao làm việc của dự án.) Ví dụ, nếu bạn kiểm xuất /calc, bạn sẽ có một bản sao làm việc như thế này:

$ svn checkout http://svn.example.com/repos/calc
A    calc/Makefile
A    calc/integer.c
A    calc/button.c
Checked out revision 56.
$ ls -A calc
Makefile  button.c integer.c .svn/
$

Danh sách những ký tự A ở bên lề trái chỉ ra rằng Subversion đang thêm một số mục vào trong bản sao làm việc của bạn. Lúc này bạn có một bản sao riêng của thư mục /calc thuộc kho lưu trữ, với một mục bổ sung —.svn—mà chứa những thông tin bổ sung cần thiết cho Subversion như được đề cập trước đây.

Giả sử bạn thay đổi trên tập tin button.c. Bởi vì thư mục .svn ghi nhớ nội dung và ngày tháng chỉnh sửa gốc của tập tin, Subversion có thể cho bạn biết rằng bạn vừa mới thay đổi tập tin. Tuy nhiên, Subversion không làm cho thay đổi của bạn công khai cho tới khi bạn yêu cầu nó làm việc đó một cách rõ ràng. Động tác phát hành thay đổi của bạn thường được biết đến nhiều hơn như là chuyển giao (hoặc kiểm nhập) những thay đổi vào kho lưu trữ.

Để phát hành thay đổi của bạn, bạn có thể dùng lệnh svn commit của Subversion:

$ svn commit button.c -m "Fixed a typo in button.c."
Sending        button.c
Transmitting file data .
Committed revision 57.
$

Lúc này những thay đổi của bạn trên tập tin button.c đã được chuyển giao vào kho lưu trữ, với một ghi chú mô tả thay đổi của bạn (chẳng hạn, bạn sửa một lỗi đánh máy). Nếu một người khác kiểm xuất một bản sao làm việc của /calc, cô ấy sẽ thấy nhưng thay đổi của bạn trong phiên bản mới nhất của tập tin.

Giả sử bạn có một người cộng tác, Sally, người mà kiểm xuất một bản sao làm việc của button.c ngay cùng thời điểm mà bạn cũng kiểm xuất. Khi bạn chuyển giao những thay đổi của bạn lên button.c, bản sao làm việc của Sally không thay đổi; Subversion chỉ sửa đổi bản sao làm việc ở thời điểm người dùng yêu cầu.

Để làm cho dự án của cô ấy hiện hành, Sally có thể yêu cầu Subversion cập nhật bản sao làm việc của cô ấy với lệnh svn update. Lệnh này sẽ kết hợp những thay đổi của bạn vào bản sao làm việc của cô ấy, cũng như thay đổi của những người khác mà được chuyển giao trước khi cô ấy kiểm xuất.

$ pwd
/home/sally/calc
$ ls -A
Makefile button.c integer.c .svn/
$ svn update
Updating '.':
U    button.c
Updated to revision 57.
$

Đầu ra của lệnh svn update chỉ ra rằng Subversion đã cập nhật nội dung của tập tin button.c. Lưu ý rằng Sally không cần thiết phải chỉ định rõ sẽ cập nhật tập tin nào; Subversion sử dụng thông tin trong thư mục .svn cũng như những thông tin khác trong kho lưu trữ để quyết định tập tin nào sẽ được cập nhật.

Bản sao làm việc phiên-bản-hỗn-hợp

Như một nguyên tắc cơ bản, Subversion cố gắng để càng linh hoạt càng tốt. Một tính linh hoạt đặc biệt đó là khả năng cho phép một bản sao làm việc chứa tập tin và thư mục với hỗn hợp của nhiều số phiên bản làm việc khác nhau. Bản sao làm việc Subversion không nhất thiết phải luôn luôn tương ứng với mỗi phiên bản riêng biệt trong kho lưu trữ; chúng có thể chứa tập tin từ nhiều phiên bản khác nhau. Ví dụ, giả sử bạn kiểm xuất một bản sao làm việc từ kho lưu trữ với phiên bản mới nhất là 4:


calc/
   Makefile:4
   integer.c:4
   button.c:4

Tại thời điểm này, thư mục làm việc này tương ứng chính xác với phiên bản 4 trong kho lưu trữ. Tuy nhiên, giả sử bạn thay đổi tập tin button.c và chuyển giao thay đổi này. Giả định rằng không có chuyển giao khác diễn ra, chuyển giao của bạn sẽ tạo phiên bản 5 của kho lưu trữ, và bản sao làm việc của bạn sẽ như sau:


calc/
   Makefile:4
   integer.c:4
   button.c:5

Giả sử rằng, vào lúc này, Sally chuyển giao một thay đổi trong tập tin integer.c, tạo ra phiên bản 6. Nếu bạn ra lệnh svn update để cập nhật bản sao làm việc của bạn, nó sẽ như thế này:


calc/
   Makefile:6
   integer.c:6
   button.c:6

Thay đổi của Sally trên tập tin integer.c sẽ xuất hiện trong bản sao làm việc của bạn, và thay đổi của bạn sẽ vẫn hiện diện trong button.c. Trong ví dụ này, văn bản của tập tin Makefile là tương đồng trong các phiên bản 4, 5 và 6 nhưng Subversion sẽ đánh dấu bản sao làm việc của Makefile với phiên bản 6 để chỉ ra rằng nó vẫn hiện hành. Như vậy, sau khi bạn thực hiện việc cập nhật toàn diện ở chóp của bản sao làm việc của bạn, nó sẽ thường tương ứng với chính xác một phiên bản trong kho.

Cập nhật và chuyển giao là tách biệt

Một trong những quy tắc cơ bản của Subversion đó là một thao tác đẩy không gây ra một thao tác kéo hoặc ngược lại. Chỉ vì bạn sẵn sàng gửi thay đổi mới tới kho lưu trữ không có nghĩa rằng bạn sẵn sàng để tiếp nhận những thay đổi mà những người khác đã chuyển giao. Và nếu bạn có thay đổi mới vẫn đang trong quá trình thay đổi, lệnh svn update sẽ hợp nhất một cách nhẹ nhàng những thay đổi trên kho lưu trữ vào trong bản sao làm việc của bạn thay vì ép bạn phải phát hành chúng.

Tác dụng phụ chủ yếu của quy tắc này đó là bản sao làm việc phải thực hiện thêm việc ghi sổ sách để theo dõi phiên bản hỗn hợp. Vấn đề trở nên phức tạp hơn vì thực tế những thư mục này đã được đánh phiên bản.

Ví dụ, giả sử rằng bạn có một bản sao làm việc mà toàn bộ ở phiên bản 10, trong khi đó những người khác đã chuyển giao những thay đổi của họ và do đó phiên bản mới nhất trong kho lưu trữ lúc này là 14. Bạn hiệu chỉnh tập tin foo.html và thực hiện lệnh svn commit mà sẽ tạo phiên bản 15 trong kho lưu trữ. Sau khi chuyển giao thành công, nhiều người sử dụng mới sẽ mong muốn bản sao làm việc sẽ toàn bộ có phiên bản 15, nhưng nó không phải như vậy! Một số thay đổi bất kỳ có thể xuất hiện trong kho lưu trữ giữa phiên bản 10 và 15. Ứng dụng khách không biết gì về những thay đổi này trong kho vì bạn chưa thực thi lệnh svn update, còn lệnh svn commit không kéo về những thay đổi mới. Mặc khác, nếu lệnh svn commit là để tải về tự động những thay đổi mới nhất, nó sẽ có khả năng thiết lập toàn bộ bản sao làm việc sang phiên bản 15—nhưng như vậy chúng ta sẽ phá vỡ quy tắc cơ bản của việc đẩykéo tồn tại như hai thao tác độc lập. Như vậy, cách an toàn duy nhất mà ứng dụng khách Subversion có thể làm là đánh dấu tập tin—foo.html—như là đang ở phiên bản 15. Phần còn lại của bản sao làm việc được duy trì với phiên bản 10. Chỉ bằng cách thực thi lệnh svn update thì những thay đổi mới nhất có thể được tải về và toàn bộ bản sao làm việc được đánh dấu với phiên bản 15.

Phiên bản hỗn hợp là bình thường

Thực tế, mỗi khi bạn thực thi lệnh svn commit thì bản sao làm việc của bạn sẽ bao gồm hỗn hợp các phiên bản. Những thay đổi bạn vừa mới chuyển giao được đánh dấu với phiên bản làm việc lớn hơn tất cả. Sau một vài chuyển giao (mà không cập nhật), bản sao làm việc của bạn sẽ chứa một hỗn hợp toàn bộ các phiên bản. Ngay cả khi chỉ có duy nhất bạn làm việc với kho lưu trữ, bạn vẫn sẽ gặp hiện tượng này. Để kiểm tra hỗn hợp các phiên bản này, dùng lệnh svn status với tùy chọn --verbose (-v) (xem chi tiết ở the section called “Xem tổng quan về những thay đổi của bạn”).

Thông thường, người dùng mới hoàn toàn không biết rằng bản sao làm việc của họ chứa nhiều phiên bản trộn lẫn. Điều này có thể gây nhầm lẫn bởi vì nhiều lệnh của ứng dụng khách rất nhạy cảm với phiên bản làm việc của những mục mà những lệnh này đang kiểm tra. Ví dụ, lệnh svn log được sử dụng để hiển thị lịch sử thay đổi trên một tập tin hoặc thư mục (xem the section called “Tạo một danh sách các thay đổi lịch sử”). Khi người sử dụng phát lệnh này trên một đối tượng phiên bản làm việc, anh ấy mong đợi được nhìn thấy toàn bộ lịch sử của đối tượng. Nhưng phiên bản làm việc của đối tượng cũ quá (thông thường bởi vì lệnh svn update không được thực thi trong một thời gian dài), lúc này lịch sử của những phiên bản cũ hơn của đối tượng được hiển thị.

Phiên bản hỗn hợp là có ích

Nếu dự án của bạn đủ phức tạp, bạn sẽ khám phá ra rằng đôi khi sẽ tốt hơn khi buộc lùi ngày (cập nhật sang một phiên bản cũ hơn phiên bản bạn đang có) một phần của bản sao làm việc của bạn sang một phiên bản cũ hơn; bạn sẽ học cách thực hiện trong Chapter 2, Cách Sử Dụng Cơ Bản. Có thể bạn muốn một phiên bản trước đó của một module được chứa trong một thư mục con, hoặc có thể bạn muốn hình dung khi nào một lỗi lần đầu xuất hiện trong một tập tin cụ thể. Đây là một dạng cổ máy thời gian của một hệ thống kiểm soát phiên bản—một tính năng mà cho phép bạn di chuyển một phần bất kỳ của bản sao làm việc của bạn tới hoặc lùi trong lịch sử làm việc.

Phiên bản hỗn hợp có mặt giới hạn

Dù bạn làm việc với phiên bản hỗn hợp cách nào thì vẫn có giới hạn với tính linh hoạt này.

Thứ nhất, bạn không thể chuyển giao việc xóa bỏ một tập tin hoặc thư mục mà không được cập nhật đầy đủ. Nếu một phiên bản mới hơn của đối tượng tồn tại trên kho lưu trữ, cố gắng xóa của bạn sẽ bị từ chối để ngăn bạn tình cờ hủy hoại những thay đổi mà bạn không nhìn thấy.

Thứ hai, bạn không thể chuyển giao một thay đổi của siêu dữ liệu trừ khi nó được cập nhật đầy đủ. Bạn sẽ học cách gắn thuộc tính vào đối tượng tại Chapter 3, Advanced Topics. Một phiên bản làm việc của thư mục định nghĩa một bộ cụ thể những mục và thuộc tính và vì vậy việc chuyển giao một thay đổi thuộc tính vào một thư mục quá-hạn có thể phá hủy những thuộc tính mà bạn không nhìn thấy.

Cuối cùng, bắt đầu từ Subversion 1.7, bạn mặc định không thể dùng một bản sao làm việc hỗn hợp như là đích trong việc hợp nhất. (Yêu cầu mới này được giới thiệu để ngăn những vấn đề chung mà xuất phát từ cách làm như vậy.)