Bạn đã đọc về bản sao làm việc, bây giờ chúng tôi sẽ chứng minh làm thế nào các khách hàng Subversion tạo ra và sử dụng chúng.
Một bản sao làm việc Subversion là một cây thư mục bình thường trên hệ thống địa phương của bạn, có chứa một bộ sưu tập các tập tin. Bạn có thể chỉnh sửa những tập tin này tuỳ cách bạn muốn, và nếu chúng là tập tin mã nguồn, bạn có thể biên dịch chương trình của bạn từ chúng 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 riêng tư của riêng bạn: Subversion sẽ không bao giờ kết hợp với thay đổi của người khác, cũng không thay đổi của bạn có sẵn cho những người khác, cho đến khi bạn cho nó để làm như vậy một cách rõ ràng .
Sau khi bạn đã thực hiện một số thay đổi các 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 đúng, Subversion cung cấp cho bạn các lệnh để xuất bản thay đổi của bạn cho người khác làm việc với bạn về dự án của bạn (bằng cách viết vào kho lưu trữ). Nếu người khác công bố những thay đổi riêng của họ, Subversion cung cấp cho bạn với lệnh hợp nhất những thay đổi đó vào thư mục làm việc của bạn (bằng cách đọc từ kho).
A working copy also contains some extra files, created and maintained by Subversion, to help it carry out these commands. In particular, your working copy contains a subdirectory named .svn
, also known as the working copy administrative directory . The files in this administrative directory help Subversion recognize which files contain unpublished changes, and which files are out-of-date with respect to others' work. Prior to 1.7 Subversion maintained .svn
administrative subdirectories in every versioned directory of your working copy. Subversion 1.7 takes a completely different approach and each working copy now has only one administrative subdirectory which is an immediate child of the root of that working copy.
Một kho lưu trữ Subversion điển hình thường xuyên tổ chức các tập tin (hoặc mã nguồn) cho 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 của kho lưu trữ. Trong sự sắp xếp này, bản sao làm việc của người dùng thường sẽ tương ứng với một cây con đặc biệt của kho.
Ví dụ, giả sử bạn có một kho lưu trữ có chứa hai dự án phần mềm.
Nói cách khác, thư mục gốc của kho lưu trữ có hai thư mục con: paint
và calc
.
To get a working copy, you must check out some subtree of the repository. (The term check out may sound like it has something to do with locking or reserving resources, but it doesn't; it simply creates a private copy of the project for you.)
Suppose you make changes to button.c
. Since the .svn
directory remembers the file's modification date and original contents, Subversion can tell that you've changed the file. However, Subversion does not make your changes public until you explicitly tell it to. The act of publishing your changes is more commonly known as committing (or checking in ) changes to the repository.
Để xuất bản các thay đổi của bạn cho người khác, bạn có thể sử dụng lệnh Subversion cam kết .
Bây giờ thay đổi của bạn button.c
đã được cam kết vào kho lưu trữ, nếu một người dùng khác kiểm tra một bản sao làm việc của / Calc
, Họ sẽ thấy các thay đổi trong phiên bản mới nhất của tập tin.
Giả sử bạn có một cộng tác viên, Sally, người kiểm tra ra một bản sao làm việc của /calc
tại cùng một thời gian bạn đã làm. Khi bạn thực hiện thay đổi của bạn trên button.c
, bản sao làm việc của Sally thì không thay đổi; Subversion chỉ thay đổi bản sao làm việc theo yêu cầu của người dùng.
Để mang lại cho dự án của mình được cập nhật, Sally có thể yêu cầu Subversion để cập nhật bản sao làm việc, bằng cách sử dụng lệnh Subversion cập nhật . Điều này sẽ kết hợp các thay đổi của bạn vào bản sao làm việc của mình, cũng như bất kỳ những người khác đã được cam kết kể từ khi cô kiểm tra nó ra.
Lưu ý rằng Sally đã không cần phải xác định các tập tin để cập nhật; Subversion sử dụng các thông tin trong thư mục . Svn
, và biết thêm thông tin trong kho, để quyết định các tập tin cần được đưa đến nay.
Kho Subversion có thể được truy cập thông qua nhiều phương pháp khác nhau - trên đĩa địa phương, hoặc thông qua giao thức mạng khác nhau. Một vị trí kho, tuy nhiên, luôn luôn là một URL. Giản đồ URL cho thấy phương pháp truy cập:
Bảng 2.1. URL truy cập kho lưu trữ
Giản đồ | Phương pháp truy cập |
---|---|
file://
| Truy cập vào kho lưu trữ trực tiếp trên ổ đĩa cục bộ hoặc mạng. |
http://
| Truy cập thông qua giao thức WebDAV đến máy chủ Apache nhận biết Subversion. |
https://
| Tương tự như http:// , nhưng với mã hóa SSL. |
svn://
| Truy cập TCP/IP không được thẩm định thông qua giao thức tùy chỉnh cho một svnserve máy chủ. |
svn+ssh://
| truy cập giao thức TCP/IP được chứng thực, mã hóa thông qua giao thức tùy chỉnh đến một svnserve máy chủ. |
Đối với hầu hết các phần, URL của Subversion sử dụng các cú pháp tiêu chuẩn, cho phép đối với tên máy chủ và số cổng được xác định như là một phần của URL. Các file://
phương pháp tiếp cận thường được sử dụng cho truy cập địa phương, mặc dù nó có thể được sử dụng với các đường dẫn UNC đến một máy chủ mạng. Do đó, URL có dạng file://hostname/path/to/repos
. Đối với các máy tính địa phương, phần hostname
của URL được yêu cầu để vắng mặt hoặc localhost
. Vì lý do này, các đường dẫn địa phương thường xuất hiện với ba dấu gạch chéo, file:///path/to/repos
.
Ngoài ra, người sử dụng lược đồ file://
trên nền tảng Windows sẽ cần phải sử dụng một cách không chính thức “ tiêu chuẩn ” cú pháp để truy cập vào kho lưu trữ trên cùng một máy, nhưng trên một ổ đĩa khác với ổ đĩa làm việc hiện tại của khách hàng. Một trong hai cú pháp đường dẫn URL sau đây sẽ làm việc X
là ổ đĩa mà kho cư trú:
file:///X:/path/to/repos ... file:///X|/path/to/repos ...
Lưu ý rằng một URL sử dụng dấu gạch chéo bình thường mặc dù hình thức bản địa (không phải URL) của một đường dẫn trên Windows sử dụng những dấu xồ nguợc.
You can access a FSFS repository via a network share, but this is not recommended for various reasons:
You are giving direct write access to all users, so they could accidentally delete or corrupt the repository file system.
Not all network file sharing protocols support the locking that Subversion requires. One day you will find your repository has been subtly corrupted.
You have to set the access permissions in just the right way. SAMBA is particularly difficult in this respect.
If one person installs a newer version of the client which upgrades the repository format, then everyone else will be unable to access the repository until they also upgrade to the new client version.
Một tác vụ cam kết svn có thể công bố thay đổi đối với bất kỳ số lượng các tập tin và thư mục như là một giao dịch nguyên tử duy nhất. Trong bản sao làm việc của bạn, bạn có thể thay đổi nội dung tập tin, tạo, xóa, đổi tên và sao chép các tập tin và thư mục, và sau đó cam kết các bộ hoàn chỉnh của các thay đổi như một đơn vị.
Trong kho lưu trữ, mỗi cam kết được đối xử như là một giao dịch nguyên tử: hoặc là tất cả các cam kết thay đổi diễn ra, hoặc không gì trong số đó diễn ra. Subversion giữ lại tính nguyên tử này trong khi đối mặt với tai nạn chương trình, sự cố hệ thống, các vấn đề mạng, và hành động khác của người dùng.
Mỗi khi kho chấp nhận một cam kết, điều này tạo ra một trạng thái mới của cây hệ thống tập tin, được gọi là sửa đổi . Mỗi sửa đổi được chỉ định một số tự nhiên duy nhất, lớn hơn số của sửa đổi trước. Việc sửa đổi ban đầu của một kho lưu trữ mới được tạo ra là số không, và bao gồm không có gì ngoài một thư mục gốc rỗng.
Một cách tốt đẹp để hình dung ra các kho lưu trữ như một loạt các cây. Hãy tưởng tượng một mảng các số sửa đổi, bắt đầu từ 0, kéo dài từ trái sang phải. Mỗi số sửa đổi có một cây treo hệ thống tập tin bên dưới nó, và mỗi cây là một “ ảnh chụp ” cách kho nhìn sau mỗi cam kết.
Điều quan trọng cần lưu ý rằng các bản sao làm việc không phải luôn luôn tương ứng với bất kỳ phiên bản duy nhất trong kho, chúng có thể chứa tập tin từ nhiều chỉnh sửa. Ví dụ, giả sử bạn kiểm tra ra một bản sao làm việc từ một kho lưu trữ có sửa đổi gần đây 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 sửa đổi 4 trong kho. Tuy nhiên, giả sử bạn thực hiện một sự thay đổi đến button.c
, và cam kết thay đổi đó. Giả sử không có các cam kết đã diễn ra, cam kết của bạn sẽ tạo sửa đổi 5 của kho, và bản sao của bạn làm việc bây giờ sẽ như thế này:
calc/Makefile:4 integer.c:4 button.c:5
Giả sử rằng, vào thời điểm này, Sally cam kết thay đổi trong integer.c
, tạo ra sửa đổi 6. Nếu bạn sử dụng svn cập nhật để mang lại bản sao làm việc của bạn được cập nhật nhất, sau đó nó sẽ như thế này:
calc/Makefile:6 integer.c:6 button.c:6
Thay đổi của Sally trong 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 có mặt trong button.c
. Trong ví dụ này, các văn bản của Makefile
là giống hệt nhau trong phiên bản 4, 5, và 6, nhưng Subversion sẽ đánh dấu bản sao của bạn làm việc của Makefile
với phiên bản 6 để chỉ ra rằng nó vẫn còn hiện tại. Vì vậy, sau khi bạn làm một cập nhật sạch sẽ ở trên cùng của bản sao làm việc của bạn, nó thường sẽ tương ứng chính xác với một bản sửa đổi trong kho.
Đối với mỗi tập tin trong một thư mục làm việc, Subversion ghi lại hai phần thông tin thiết yếu trong khu vực hành chính svn/.
:
what revision your working file is based on (this is called the file's working revision ), and
một ghi dấu thời gian khi các bản sao địa phương được cập nhật lần cuối bởi kho lưu trữ.
Với thông tin này, bằng cách nói chuyện với kho, Subversion có thể cho biết trong bốn trạng thái sau đây mà một tập tin làm việc có:
Các tập tin là không thay đổi trong thư mục làm việc, và không có thay đổi đến tập tin đó đã được cam kết vào kho kể từ khi sửa đổi làm việc của nó. Một cam kết tập tin sẽ không làm gì, và một cập nhật của các tập tin sẽ không làm gì cả.
Các tập tin đã được thay đổi thư mục làm việc, và không có thay đổi đến tập tin đó được cam kết vào kho kể từ khi sửa đổi bản cơ sở của nó. Có thay đổi cục bộ đã không được cam kết vào kho lưu trữ, do đó một cam kết của tập tin sẽ thành công trong việc xuất bản các thay đổi của bạn, và một cập nhật của các tập tin sẽ không làm gì cả.
Các tập tin đã không được thay đổi trong thư mục làm việc, nhưng nó đã được thay đổi trong kho. Tập tin cuối cùng sẽ được cập nhật, để làm cho nó hiện tại với bản chỉnh sửa công cộng. Một cam kết tập tin sẽ không làm gì, và một cập nhật của tập tin sẽ đưa thay đổi mới nhất vào bản sao làm việc của bạn.
Tập tin đã được thay đổi trong thư mục làm việc, và trong kho. Một cam kết của tập tin sẽ thất bại với một lỗi quá ngày. Tập tin cần được cập nhật đầu tiên; lệnh cập nhật sẽ cố gắng hợp nhất những thay đổi công cộng này với những thay đổi của địa phương. Nếu Subversion không thể hoàn thành việc hợp nhất một cách chính đáng tự động, nó để lại cho người sử dụng để giải quyết cuộc xung đột.