2013-10-09 19 views
28

Làm cách nào để tìm phiên bản sao chép làm việc (SVN 1.7 so với 1.8) bằng cách xem các tập tin bên trong .svn mà không sử dụng bất kỳ công cụ SVN nào?Tìm phiên bản sao chép SVN (1.7 hoặc 1.8)

+1

bản sao có thể có của [Làm cách nào để xác định Phiên bản bố cục công việc SVN?] (Http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-version) –

+1

Câu trả lời chung chung hơn cho câu hỏi này đã tồn tại: http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-v ersion –

+0

Bản sao có thể có của * [Làm cách nào để xác định phiên bản bố cục làm việc SVN?] (http://stackoverflow.com/questions/1364618) *. –

Trả lời

41

Tôi đã tự hỏi về điều này bản thân mình trong một thời gian và không thể tìm thấy câu trả lời ở bất cứ đâu, thậm chí không bằng cách xem cơ sở dữ liệu SQLite. Vì vậy, tôi đã kết thúc nhìn vào mã nguồn Subversion, nơi tôi thấy rằng phiên bản thực sự được lưu trữ trong cơ sở dữ liệu, tôi chỉ không nhìn vào đúng nơi. Dưới đây là đoạn mã có liên quan từ subversion/libsvn_subr/sqlite.c:

svn_error_t * 
svn_sqlite__read_schema_version(int *version, 
           svn_sqlite__db_t *db, 
           apr_pool_t *scratch_pool) 
{ 
    (...) 
    SVN_ERR(prepare_statement(&stmt, db, "PRAGMA user_version;", scratch_pool)); 
    (...) 
} 

Tôi thậm chí còn không nhận thức được tuyên bố PRAGMA, trong đó, theo SQLite documentation là ...

... một phần mở rộng SQL cụ thể để SQLite và được sử dụng để sửa đổi hoạt động của thư viện SQLite hoặc truy vấn thư viện SQLite cho dữ liệu bên trong (không phải bảng).

Như vậy, giả sử một phiên bản cập nhật lên một cách hợp lý của SQLite trên PATH bạn có thể làm ...

sqlite3 .svn/wc.db "PRAGMA user_version" 

... trong thư mục gốc của bản sao làm việc của bạn, mà sau đó sẽ sản lượng ví dụ 29 cho Subversion 1.7.13 và 31 cho Subversion 1.8.0. Rất tiếc, không có danh sách nào tương ứng với user_version với phiên bản Subversion, nhưng nếu bạn quan tâm đến những thay đổi định dạng thực sự bao gồm, bạn có thể tìm thấy chúng được mô tả trong các nguồn ở subversion/libsvn_wc/wc-metadata.sql cho định dạng 20 trở đi.

Cập nhật 1: Phát biểu tại câu hỏi làm thế nào để lấy giá trị của user_version mà không có một thực thi SQLite: Bạn cần phải đọc một DWORD tại offset 60 trong file cơ sở dữ liệu, theo quy định tại các SQLite file format specification (xem "1.2 Cơ sở dữ liệu Tiêu đề ").

Cập nhật 2: Để làm rõ hơn cách xem trong trình xem tệp văn bản/nhị phân: Vì số phiên bản hiện tại vẫn còn khá thấp và vừa với một byte (nghĩa là chúng nhỏ hơn 255) và DWORD dài bốn byte, hiện tại đủ để xem byte ít quan trọng nhất - đó là số byte 64. Dưới đây là một ảnh chụp màn hình về cách nó trông giống như trong tệp cơ sở dữ liệu SQLite của bản sao làm việc của Subversion 1.8.0, có chứa 31 cho user_version - như đã đề cập ở trên.

Subversion 1.8.0 SQLite database in Text viewer

Cập nhật 3: Tôi đã luôn luôn tìm kiếm một cách để làm "truy vấn nhị phân" như vậy với một công cụ dòng lệnh, để tránh ném perl hay như vậy ở vấn đề. Turns out there's a *nix utility for that called od (và tôi thậm chí đã có nó trong bộ sưu tập của tôi về các cổng win32, yay!).od có thể nhận được các byte trọng số thấp nhất của user_version như thế này:

od -An -j63 -N1 -t dC .svn/wc.db 

này sẽ một lần nữa sản lượng 31 cho Subversion 1.8.0 và vân vân.

-2

Không thể tìm thấy tài liệu về điều này cho đến nay, tuy nhiên câu trả lời ngắn gọn là - bạn có thể. Peek vào \.svn\format tệp. Ví dụ, số 12 có nghĩa là bản sao làm việc có định dạng SVN 1.8. Tôi cho rằng nếu nó là của SVN 1.7, thì bạn sẽ thấy 11 ở đó.

+3

-1 Không phải là nó - chỉ cần thử nó với Subversion 1.7.13 vs 1.8.0 và cả hai đầu ra '12' trong tập tin' định dạng'. – zb226

+1

Điều đó có thể là do các phiên bản đó thực sự có cùng định dạng repo ... – prodigitalson

+1

OK, nhưng điều đó vẫn không giúp phân biệt 1,7 từ 1,8 WC - đó là câu hỏi. Bạn không thể hoạt động trên 1,7 WC với 1.8 và ngược lại. – zb226

15

Nếu .svn/định dạng tồn tại, sau đó đọc số trong đó:

Version 7 is SVN 1.3 
Version 8 is SVN 1.4 
Version 9 is SVN 1.5 

Nếu .svn/định dạng không tồn tại sau đó số phiên bản là trên dòng đầu tiên trong svn/mục:

Version 10 is SVN 1.6 
Version 12 is SVN 1.7 
+3

Đó là những gì tôi đã thử, nhưng có vẻ như SVN 1.7 và SVN 1.8 bản sao làm việc của cả hai đều hiển thị phiên bản 12. –

+0

@ThomasS. bạn có chắc chắn về cả hai bản sao làm việc là SVN khác nhau? – Shafeeque

+0

Có, định dạng đã được thay đổi từ 1,7 đến 1,8 và chúng không tương thích với nhau. – mliebelt

Các vấn đề liên quan