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.
Kho lưu trữ Subversion của bạn giống như một cỗ máy thời gian. Nó lưu giữ một bản ghi của mỗi thay đổi đã được chuyển giao và cho phép bạn khám phá lịch sử này bằng cách xem xét phiên bản trước đó của những tập tin và thư mục cũng như các siêu dữ liệu đi kèm với chúng. Với một lệnh Subversion đơn giản, bạn có thể kiểm xuất kho lưu trữ (hoặc là phục hồi một bản sao làm việc đã tồn tại) trở về tình trạng y như nó ở một ngày tháng cụ thể hoặc một số phiên bản cụ thể trong quá khứ. Tuy nhiên, đôi khi bạn chỉ muốn nhìn vào quá khứ thay vì đi vào trong nó.
Rất nhiều lệnh có thể cung cấp cho bạn dữ liệu lịch sử từ kho lưu trữ:
Hiển thị chi tiết theo từng dòng của một thay đổi cụ thể
Hiển thị nhiều thông tin: ghi chú nhật ký với ngày tháng, thông tin tác giả đi kèm phiên bản và những đường dẫn nào được thay đổi trong mỗi phiên bản
Lấy về một tập tin từ một phiên bản cụ thể và hiển thị nó trên màn hình của bạn
Lấy về một tập tin người-đọc-hiểu-được từ một phiên bản cụ thể và hiển thị nội dung của nó theo dạng bảng với thông tin được thay đổi cuối cùng đại diện cho mỗi dòng của tập tin.
Hiển thị những tập tin trong một thư mục của một phiên bản cụ thể
Chúng ta đã xem qua lệnh svn diff—nó hiển thị những khác biệt trên tập tin theo định dạng unified diff; chúng ta sử dụng nó để hiển thị những thay đổi cục bộ được thực hiện trên bản sao làm việc trước khi chuyển giao đến kho lưu trữ.
Trên thực tế, nó chỉ ra rằng có ba dạng sử dụng khác biệt của lệnh svn diff:
Xem xét những thay đổi cục bộ
So sánh bản sao làm việc của bạn với kho lưu trữ
So sánh những phiên bản trên kho lưu trữ
Như chúng ta đã thấy, gọi lệnh svn diff
mà không có tham số sẽ so sánh những tập tin đang làm việc của bạn với bản sao “nguyên sơ” được lưu trữ trong vùng .svn
:
$ svn diff Index: rules.txt =================================================================== --- rules.txt (revision 3) +++ rules.txt (working copy) @@ -1,4 +1,5 @@ Be kind to others Freedom = Responsibility Everything in moderation -Chew with your mouth open +Chew with your mouth closed +Listen when others are speaking $
Nếu một số phiên bản được truyền --revision
(-r
), bản sao làm việc của bạn được so sánh với một phiên bản cụ thể trong kho lưu trữ:
$ svn diff -r 3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revision 3) +++ rules.txt (working copy) @@ -1,4 +1,5 @@ Be kind to others Freedom = Responsibility Everything in moderation -Chew with your mouth open +Chew with your mouth closed +Listen when others are speaking $
Nếu hai số phiên bản, được phân cách bằng dấu hai chấm, được truyền vào tham số --revision
(-r
) thì hai phiên bản này sẽ được so sánh trực tiếp:
$ svn diff -r 2:3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revision 2) +++ rules.txt (revision 3) @@ -1,4 +1,4 @@ Be kind to others -Freedom = Chocolate Ice Cream +Freedom = Responsibility Everything in moderation Chew with your mouth open $
Một cách tiện hơn để so sánh một phiên bản với phiên bản trước đó là sử dụng tuỳ chọn --change
(-c
):
$ svn diff -c 3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revision 2) +++ rules.txt (revision 3) @@ -1,4 +1,4 @@ Be kind to others -Freedom = Chocolate Ice Cream +Freedom = Responsibility Everything in moderation Chew with your mouth open $
Cuối cùng, bạn có thể so sánh những phiên bản kho lưu trữ ngay cả khi bạn không có một bản sao làm việc trên máy trạm của bạn bằng cách cung cấp thêm URL thích hợp vào dòng lệnh:
$ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt … $
Để tìm thông tin lịch sử của một tập tin hoặc thư mục, sử dụng lệnh svn log. Lệnh này cung cấp cho bạn bản ghi với thông tin ai là người đã thực hiện thay đổi trên tập tin hoặc thư mục, ở phiên bản nào, ngày và giờ của phiên bản đó và—nếu nó được cung cấp—ghi chú nhật ký đi kèm với chuyển giao:
$ svn log ------------------------------------------------------------------------ r3 | sally | 2008-05-15 23:09:28 -0500 (Thu, 15 May 2008) | 1 line Added include lines and corrected # of cheese slices. ------------------------------------------------------------------------ r2 | harry | 2008-05-14 18:43:15 -0500 (Wed, 14 May 2008) | 1 line Added main() methods. ------------------------------------------------------------------------ r1 | sally | 2008-05-10 19:50:31 -0500 (Sat, 10 May 2008) | 1 line Initial import ------------------------------------------------------------------------
Lưu ý rằng ghi chú nhật ký mặc nhiên được in đảo ngược theo trình tự thời gian. Nếu bạn muốn xem một khoảng các phiên bản khác theo một trình tự cụ thể hoặc là chỉ một phiên bản, bạn truyền thêm tham số --revision
(-r
):
Table 2.1. Một vài lệnh log thông dụng
Lệnh | Mô tả |
---|---|
svn log -r 5:19
|
Hiển thị nhật ký theo trình tự thời gian cho các phiên bản từ 5 đến 19 |
svn log -r 19:5
|
Hiển thị nhật ký theo trình tự thời gian đảo ngược cho các phiên bản từ 5 đến 19 |
svn log -r 8
|
Hiển thị nhật ký chỉ cho phiên bản 8 |
Bạn cũng có thể xem lịch sử nhật ký của một tập tin hoặc thư mục riêng lẻ. Ví dụ:
$ svn log foo.c … $ svn log http://foo.com/svn/trunk/code/foo.c …
Những thông báo này sẽ chỉ hiển thị cho những phiên bản mà tập tin (hoặc thư mục) với tên được cung cấp có sự thay đổi.
Nếu bạn muốn nhiều thông tin hơn nữa về tập tin và thư mục, lệnh svn log cũng có một tuỳ chọn --verbose
(-v
). Bởi vì Subversion cho phép bạn di chuyển và sao chép những tập tin và thư mục nên theo dõi việc thay đổi đường dẫn trong hệ thống tập tin là điều quan trọng. Vì vậy trong chế độ verbose, lệnh svn log sẽ bao gồm trong kết quả của nó một danh sách của những đường dẫn bị thay đổi trong phiên bản:
$ svn log -r 8 -v ------------------------------------------------------------------------ r8 | sally | 2008-05-21 13:19:25 -0500 (Wed, 21 May 2008) | 1 line Changed paths: M /trunk/code/foo.c M /trunk/code/bar.h A /trunk/code/doc/README Frozzled the sub-space winch. ------------------------------------------------------------------------
Lệnh svn log cũng có một tham số --quiet
(-q
) mà cắt bỏ phần thân của ghi chú nhật ký. Khi kết hợp với --verbose
(-v
) thì nó chỉ cung cấp cho bạn tên của những tập tin bị thay đổi.
Kể từ Subversion 1.7, người sử dụng giao diện dòng lệnh Subversion còn có thể tận dụng lợi thế của một chế độ xuất kết quả đặc biệt cho lệnh svn log mà tích hợp một báo cáo dạng khác tương tự như báo cáo được kết xuất bởi lệnh svn diff chúng tôi đã giới thiệu trước đây. Khi bạn thực thi lệnh svn log với tham số --diff
, Subversion sẽ chèn vào mỗi khối nhật ký trong báo cáo nhật ký một báo cáo khác theo-kiểu-diff. Đây là một cách rất tiện lợi để xem được cả hai dạng thay đổi mức-cao, thay đổi ngữ nghĩa và theo dạng dựa-trên-dòng của một phiên bản ở cùng một thời điểm!
Bắt đầu với Subversion 1.8, lệnh svn log chấp nhận tham số --search
và --search-and
. Những tuỳ chọn này cho phép bạn lọc kết quả của lệnh svn log dựa trên mẫu tìm kiếm bạn cung cấp. Khi sử dụng những tuỳ chọn này, ghi chú nhật ký chỉ xuất hiện nếu tác giả phiên bản, ngày tháng, văn bản ghi chú nhật ký hoặc danh sách những đường dẫn thay đổi khớp với mẫu tìm kiếm.
Sử dụng lệnh svn cat và svn list, bạn có thể xem nhiều phiên bản của những tập tin và thư mục mà không cần phải thay đổi phiên bản làm việc của bản sao làm việc của bạn. Trên thực tế, để có thể sử dụng hai lệnh này bạn không cần phải có một bản sao làm việc.
Nếu bạn muốn xem xét một phiên bản trước đó của tập tin và không cần thiết phải xem sự khác biệt giữa hai tập tin thì bạn có thể dùng lệnh svn cat:
$ svn cat -r 2 rules.txt Be kind to others Freedom = Chocolate Ice Cream Everything in moderation Chew with your mouth open $
Bạn cũng có thể chuyển kết quả trực tiếp vào một tập tin:
$ svn cat -r 2 rules.txt > rules.txt.v2 $
Lệnh svn annotate rất giống với lệnh svn cat mà chúng ta đã thảo luận trong phần trước. Lệnh này cũng hiển thị nội dung của tập tin được đánh phiên bản nhưng nó hiển thị theo dạng bảng. Mỗi dòng kết quả không phải chỉ là dòng chứa nội dung tập tin mà còn chứa tên đăng nhập, số phiên bản và dấu ngày tháng của phiên bản mà dòng này lần cuối được chỉnh sửa.
Khi được sử dụng với một tập tin trên bản sao làm việc, lệnh svn annotate sẽ mặc nhiên hiển thị thuộc tính theo-từng-dòng của tập tin như nó đang được xuất hiện trên bảo sao làm việc.
$ svn annotate rules.txt 1 harry Be kind to others 3 sally Freedom = Responsibility 1 harry Everything in moderation - - Chew with your mouth closed - - Listen when others are speaking
Lưu ý rằng có một số dòng không có thuộc tính. Trường hợp này là bởi vì những dòng này được chỉnh sửa trong phiên bản thuộc bản sao làm việc của tập tin. Trong trường hợp này, svn annotate là một phương tiện khác giúp bạn biết được những dòng nào trên tập tin mà bạn đã thay đổi. Bạn có thể sử dụng thêm từ khoá phiên bản BASE
(xem the section called “Revision Keywords”) để chỉ xem dạng chưa chỉnh sửa của tập tin bởi vì nó đang tồn tại trong bản sao làm việc của bạn.
$ svn annotate rules.txt@BASE 1 harry Be kind to others 3 sally Freedom = Responsibility 1 harry Everything in moderation 1 harry Chew with your mouth open
Tuỳ chọn --verbose (-v)
cũng yêu cầu svn annotate xuất thêm trên mỗi dòng thông tin ngày tháng liên quan đến số phiên bản của dòng đó. (Việc này sẽ làm cho độ rộng của mỗi dòng kết quả lớn hơn rất nhiều, vì vậy chúng tôi bỏ qua phần ví dụ ở đây.)
Tương tự lệnh svn cat, bạn cũng có thể dùng lệnh svn annotate để hiển thị những phiên bản trước đó của tập tin. Nó là một thủ thuật hữu dụng trong tình huống sau khi đã biết ai là người cuối cùng chỉnh sửa một dòng cụ thể trên tập tin, bạn tiếp theo có thể muốn biết ai đã điều chỉnh cũng dòng đó trước đó nữa.
$ svn blame rules.txt -r 2 1 harry Be kind to others 1 harry Freedom = Chocolate Ice Cream 1 harry Everything in moderation 1 harry Chew with your mouth open
Không giống lệnh svn cat, hoạt động của lệnh svn annotate được gắn chặt với khái niệm “dòng” văn bản trên một tập tin dạng người-đọc-hiểu-được. Như vậy, nếu bạn cố thực thi lệnh này với một tập tin mà Subversion đã xác định không phải là dạng người-đọc-hiểu-được (dựa trên thuộc tính svn:mime-type
—xem chi tiết ở the section called “File Content Type”), bạn sẽ nhận được thông báo lỗi.
$ svn annotate images/logo.png Skipping binary file (use --force to treat as text): 'images/logo.png' $
Như được gợi ý trong thông báo lỗi, bạn có thể sử dụng tuỳ chọn --force
để vô hiệu hóa việc kiểm tra này và tiếp tục thực hiện lệnh annotate với giả định rằng nội dung tập tin là dựa-trên-dòng và theo dạng người-đọc-hiểu-được. Một cách tự nhiên, nếu bạn ép Subversion thực hiện lệnh annotate trên một tập tin không phải văn bản, bạn sẽ nhận được kết quả không mong muốn: một màn hình đầy thông tin vô nghĩa.
$ svn annotate images/logo.png --force 6 harry \211PNG 6 harry ^Z 6 harry 7 harry \274\361\MI\300\365\353^X\300…
Tip | |
---|---|
Tùy thuộc vào tâm trạng của bạn ở thời điểm bạn thực thi lệnh này và tùy thuộc vào mục đích của bạn, bạn có thể nhập |
Cuối cùng, như với những lệnh dạng tra cứu thông tin, bạn có thể tham chiếu đến tập tin trong việc thực thi lệnh svn annotate với URL trỏ đến kho lưu trữ của những tập tin này, cho phép truy cập vào thông tin ngay cả khi bạn không có bản sao làm việc.
Lệnh svn list hiển thị những tập tin trong một thư mục trên kho lưu trữ mà không cần phải tải những tập tin này về máy trạm của bạn:
$ svn list http://svn.example.com/repo/project README branches/ tags/ trunk/
Nếu bạn muốn một danh sách chi tiết hơn, truyền tham số --verbose
(-v
) để nhận kết quả như sau:
$ svn list -v http://svn.example.com/repo/project 23351 sally Feb 05 13:26 ./ 20620 harry 1084 Jul 13 2006 README 23339 harry Feb 04 01:40 branches/ 23198 harry Jan 23 17:17 tags/ 23351 sally Feb 05 13:26 trunk/
Những cột này cung cấp cho bạn thông tin về phiên bản mà tập tin hoặc thư mục lần cuối được thay đổi, người thực hiện việc chỉnh sửa, kích thước nếu đó là tập tin, ngày tháng mà nó được chỉnh sửa và tên của nó.
Warning | |
---|---|
Lệnh |
Ngoài những lệnh này, bạn có thể sử dụng lệnh svn update với tham số --revision
(-r
) để cập nhật lại toàn bộ bản sao làm việc “quay lại thời gian”:[7]
# Make the current directory look like it did in r1729. $ svn update -r 1729 Updating '.': … $
Tip | |
---|---|
Rất nhiều người mới sử dụng Subversion cố thực thi mẫu lệnh svn update bên trên để “hoàn tác” những thay đổi đã chuyển giao, nhưng việc này không phù hợp vì bạn không thể chuyển giao những thay đổi mà bạn thực hiện trên một bản sao làm việc không hiện dịch nếu tập tin được thay đổi có phiên bản mới hơn. Xem the section called “Resurrecting Deleted Items” để nắm được cách “hoàn tác” một chuyển giao. |
Nếu bạn muốn tạo một bản sao làm việc hoàn toàn mới từ một phiên bản cũ, bạn có thể thực hiện được bằng cách điều chỉnh lệnh svn checkout, tương tự như với lệnh svn
update bạn có thể cung cấp thêm tham số --revision
(-r
). Tuy nhiên với những lý do mà chúng tôi đề cập ở the section called “Peg and Operative Revisions”, bạn có thể chỉ định phiên bản mong muốn như một phần của cú pháp URL mở rộng của Subversion.
# Checkout the trunk from r1729. $ svn checkout http://svn.example.com/svn/repo/trunk@1729 trunk-1729 … # Checkout the current trunk as it looked in r1729. $ svn checkout http://svn.example.com/svn/repo/trunk -r 1729 trunk-1729 … $
Cuối cùng, nếu bạn đang chuẩn bị một bản phát hành và muốn đóng gói những tập tin và thư mục đã được đánh phiên bản, bạn có thể dùng lệnh svn export để tạo một bản sao cục bộ của toàn bộ hoặc một phần kho lưu trữ của bạn mà không có bất kỳ thư mục quản trị .svn
nào đi kèm. Cú pháp cơ bản của lệnh con này tương đồng với lệnh svn checkout:
# Export the trunk from the latest revision. $ svn export http://svn.example.com/svn/repo/trunk trunk-export … # Export the trunk from r1729. $ svn export http://svn.example.com/svn/repo/trunk@1729 trunk-1729 … # Export the current trunk as it looked in r1729. $ svn export http://svn.example.com/svn/repo/trunk -r 1729 trunk-1729 … $