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.

Xem Xét Lịch Sử

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ữ:

svn diff

Hiển thị chi tiết theo từng dòng của một thay đổi cụ thể

svn log

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

svn cat

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

svn annotate

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.

svn list

Hiển thị những tập tin trong một thư mục của một phiên bản cụ thể

Xem chi tiết những thay đổi trong lịch sử

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ữ

Xem xét những thay đổi cục bộ

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
$

So sánh bản sao làm việc với kho lưu trữ

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
$

So sánh những phiên bản trên kho lưu trữ

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ạo một danh sách các thay đổi lịch sử

Để 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--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.

Duyệt kho lưu trữ

Sử dụng lệnh svn catsvn 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.

Hiển thị nội dung tập tin

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
$

Hiển thị thuộc tính thay đổi theo-từng-dòng

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] 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 svn blame … hoặc svn praise … thay vì dùng dạng chính tắc svn annotate của lệnh này. Việc này ổn—những nhà phát triển Subversion đã dự đoán trước, những biệt danh này cũng sử dụng được!

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.

Liệt kê danh sách những thư mục được định phiên bản

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] Warning

Lệnh svn list không có tham số có đích mặc nhiên là URL kho lưu trữ của thư mục làm việc chứ không phải thư mục của bản sao làm việc cục bộ. Cuối cùng, nếu bạn muốn xem danh sách những tập tin trên thư mục cục bộ của bạn, bạn có thể sử dụng lệnh ls (hoặc bất kỳ lệnh phù hợp nào đó trên hệ điều hành của bạn).

Lấy lại những phiên bản cũ trên kho lưu trữ

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] 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
…
$


[7] Thấy không? Chúng tôi đã nói rằng Subversion là một cỗ máy thời gian.