2008-10-15 12 views
12

Chúng tôi đang trong quá trình di chuyển kho SVN của chúng tôi từ máy này sang máy khác, và với nó sẽ đến một tên miền mới cho repo mới. Vấn đề là, trong kho lưu trữ, có rất nhiều tham chiếu svn: externals cho các dự án khác trong kho lưu trữ. Ví dụ: chúng tôi có projectA, có thuộc tính svn: externals:Cách di chuyển tất cả các URL trong thuộc tính svn: externals trên một kho lưu trữ?

external/libraryA svn://oldserver.net/repo/libraryA 
external/libraryB svn://oldserver.net/repo/libraryB 

... v.v. Tất cả URL đều tham chiếu đến tên miền cụ thể này, vì vậy nó có thể được phân tích cú pháp dễ dàng. Sau khi đã học được bài học của mình, tôi sẽ di chuyển các URL này thành "svn: // localhost /", nhưng tôi cần tìm cách đi qua lịch sử kho lưu trữ và viết lại tất cả các URL cũ, để chúng tôi vẫn có thể kiểm tra các phiên bản cũ hơn của các dự án này mà không có liên kết bị hỏng.

Tôi làm cách nào để thực hiện việc này?

+2

Bài học cụ thể nào bạn đang đề cập đến với "svn: // localhost /" -thing? – conny

+0

Ý tôi là, người ta nên sử dụng tên máy chủ chung thay vì tên miền cụ thể khi có thể, bởi vì khi tên miền thay đổi, tôi kết thúc với một mớ hỗn độn như thế này. =/ –

+4

Tôi không thấy cần sử dụng tiền tố svn: // localhost. Bạn có biết rằng bạn có thể sử dụng URL tương đối không? Xem http://subversion.tigris.org/svn_1.5_releasenotes.html#externals –

Trả lời

7

Như bạn đã chỉ ra rằng bạn vẫn muốn có thể kiểm tra các phiên bản cũ hơn, giải pháp duy nhất thực sự là "viết lại" toàn bộ lịch sử (giải pháp D đã đề cập trước đó).

Để làm điều này, bạn nên:

1) Dump các nội dung của kho toàn bộ sử dụng svnadmin dump:

$ svnadmin dump /path/to/repos > original-dumpfile 
* Dumped revision 0. 
* Dumped revision 1. 
* Dumped revision 2. 
* Dumped revision 3. 

2) Chỉnh sửa các tập tin dump, để thay đổi svn: externals URL . Đây là phần khó nhất: Giả sử kho lưu trữ chứa dữ liệu nhị phân, mở tệp kết xuất trong một trình soạn thảo văn bản thuần túy sẽ rất có khả năng làm hỏng tệp kết xuất. Tôi đã có kinh nghiệm tốt bằng cách sử dụng cái gọi là "hex-biên tập viên", ví dụ các Freeware Hex Editor XVI32

3) Tạo một kho lưu trữ mới và nạp dumpfile sửa đổi vào nó:

$ svnadmin create newrepos 
$ svnadmin load newrepos < modified-dumpfile 

Để biết thêm thông tin, bạn cũng có thể quan tâm đến liên kết này:
http://svnbook.red-bean.com/en/1.1/ch05s03.html

LƯU Ý: Subversion 1.5 thực sự thêm hỗ trợ cho URL tương đối trong svn: externals tài sản, mà chính xác có thể ngăn chặn các loại của các vấn đề trong tương lai:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals

+0

Đây là giải pháp, nhưng bạn thực sự không muốn mở một tệp kết xuất vừa phải có kích thước vừa phải trong trình chỉnh sửa ... ' sed 'để giải cứu! – jeroenh

+1

Bạn không bao giờ nên chỉnh sửa một bãi chứa SVN với một trình soạn thảo văn bản trừ khi bạn sẵn sàng đối phó với các băm MD5 và SHA1 cho các tập tin và dữ liệu chống đỡ. Việc tính toán lại thủ công các băm này làm cho việc chỉnh sửa thủ công các tệp kết xuất SVN của bất kỳ thứ gì nhiều hơn vài chục vòng quay một công việc khó khăn. Tốt hơn hết là nên sử dụng một trong những công cụ được tạo cho công việc như svndumptool. – Ausmith1

0

Bạn có thể:

a) kiểm tra phiên bản cũ, và thay đổi host-file của bạn để trỏ tên cũ sang địa chỉ mới, sau đó svn update. Trong trường hợp đường dẫn URL cũng thay đổi ... thì bạn cũng có thể:

b) dành thời gian để viết tập lệnh tìm các thuộc tính trong bản sao hiện tại (bản sửa đổi cũ) và thay đổi URL tại đó mà không cam kết. HOẶC:

c) ghi lại (các) sửa đổi nơi bạn đã kiểm tra giá trị thuộc tính mới, xem phiên bản cũ và chỉ cần hợp nhất các sửa đổi đó (chỉ ảnh hưởng đến thuộc tính) bản sao làm việc.

d) hoặc, có thể, sử dụng svndump để đổ dữ liệu kho, chuỗi thay thế các URL trong bãi, sau đó khôi phục lại nó .. tôi sẽ không cung cấp cho bạn bất kỳ sự đảm bảo rằng ngay cả việc ;-)

19

Tôi muốn sử dụng SvnDumpTool cho việc này. Nó có chính xác những gì bạn đang tìm kiếm:

svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile 

Điều này sẽ sửa từng bên ngoài thành subversion 1.5 format và sử dụng URL tương đối.

Vì vậy svn: externals như:

external/libraryA svn://oldserver.net/repo/libraryA 

trở thành:

/repo/libraryA external/libraryA 

sử dụng máy chủ gốc URL tương đối.

+0

Tôi không hiểu phần thứ hai (sau regex). Vui lòng cho biết chi tiết hơn? Cảm ơn bạn . – moujib

+1

Tôi đã thêm một liên kết có liên quan và thêm làm rõ thêm cho câu trả lời. Hi vọng điêu nay co ich. – ldav1s

+0

Xem bài đăng này cũng: http://stackoverflow.com/questions/21292688/regex-for-svndumptool?lq=1 – Ausmith1

1

Tôi đã phải di dời 12 bản sao làm việc trên 9 người dùng và 4 lần triển khai. Đó là một sự thay đổi đơn giản, thay thế một tên miền với một IP, tức là thing.domain.net -> 192.168.0.1

Mong svn relocate cư xử như mô tả (đi qua externals lồng nhau) Tôi đã viết một hướng dẫn DOS đơn giản để chạy tại mỗi địa điểm:

for /D %G in (*) do ( cd ./%G & svn relocate http://thing.domain.net http://192.168.0.1 & cd ..)

Điều này không hoạt động như mong đợi, chỉ di chuyển WC chính.

Giải pháp của tôi là tự chỉnh sửa kho lưu trữ (Tôi đã sử dụng Tortoise Repo Browser) để thay đổi vị trí của các bên ngoài. Sau sự thay đổi này, bản cập nhật cho phụ huynh di dời là tất cả những gì cần thiết để đưa mọi thứ vào hàng.

Nó có lẽ sẽ là một ý tưởng tốt để có được tất cả người dùng Rùa để xóa lịch sử URL của họ để họ không vô tình thực hiện các hoạt động sử dụng các URL cũ (nó vẫn còn tồn tại trong việc tra cứu DNS):

Settings->Saved Data->URL history->Clear

1

tôi thay đổi nội dung tập tin dump của tôi với vi nhưng tôi đã phải sử dụng công tắc "-b" để chỉnh sửa trong chế độ nhị phân sao cho bất kỳ nhân vật mà có thể được hiểu là kết thúc dòng không được chuyển đổi.

ví dụ: vi -b filename.dump

Ngoài ra, tôi thấy rằng, nếu độ dài URL của bạn thay đổi, có độ dài chuỗi cũng phải được sửa đổi. Ví dụ, hãy xem xét một mục trông như thế này:

Node-đường dẫn: trunk/src/bao gồm

Node hiện vật: dir

Node-action: thay đổi

Prop-content chiều dài: 192

Content-length: 192

K13

012.

svn: externals

V 156

MGL_ABC svn: // server_name/dir1/dir2

MGL_DEF svn: // server_name/dir1/dir3

Khi bạn sửa đổi các URL, nếu độ dài của chuỗi thay đổi, bạn cũng cần thay đổi "192", "192" và "156" để khớp với độ dài mới. Tôi thấy khó tính toán độ dài tuyệt đối nhưng dễ tìm ra sự khác biệt. Ví dụ:
Ví dụ: giả sử URL 1 trở nên ngắn hơn 3 ký tự và URL 2 trở nên ngắn hơn 4 ký tự. Sau đó, bạn sẽ phải thu nhỏ '7' từ mỗi số trong ba số chuỗi dài đó.

0

Tất cả các bên ngoài của tôi đều nằm trong các thư mục có tên flow. Tôi đã sửa các URL trong phần bên ngoài của mình bằng một lớp lót (bash shell):

 
for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done