2009-01-06 28 views
153

Tôi có thư mục "tài liệu" trong kho lưu trữ Subversion có tên là "project". Tôi đã đi đến kết luận rằng nó thực sự nên được lưu giữ dưới một kho lưu trữ Subversion riêng biệt có tên là "project_docs".Làm cách nào để di chuyển một thư mục từ một kho lưu trữ Subversion sang một kho lưu trữ khác?

Tôi muốn di chuyển thư mục "tài liệu" (và tất cả các bản sửa đổi) vào kho lưu trữ "project_docs". Có cách nào để làm việc này không?

Trả lời

177

Nếu bạn có quyền truy cập kho lưu trữ (không phải bản sao làm việc), bạn có thể đổ kho lưu trữ hiện tại, lọc nó để chỉ bao gồm thông tin về thư mục tài liệu và tải nó vào kho lưu trữ khác.

Sẽ là một cái gì đó như thế này:

svnadmin dump /svn/old_repos > ./repository.dump 
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops <./repository.dump> ./docs_only.dump 
svnadmin load /svn/new_repos < ./docs_only.dump 

Nếu không có quyền truy cập vào kho lưu trữ, bạn không thể duy trì lịch sử sửa đổi và bạn phải giải quyết để sao chép các tập tin vào kho mới và cam kết.

+1

Ví dụ hay. Lưu ý rằng như đã nêu trong tài liệu tôi liên kết đến, giải pháp này sẽ đánh số lại tất cả các bản sửa đổi để không có "ô trống". Cần ghi nhớ điều gì đó nếu bạn tham khảo các bản sửa đổi tài liệu ở bất kỳ nơi nào khác. –

+1

Tôi đã đề xuất xóa các bản sửa đổi trống để tránh thêm một loạt các bản sửa đổi trống vào kho lưu trữ đích, rất có thể gây nhầm lẫn cho bất kỳ ai không biết về tải. Vì --preserve-revprops sẽ giữ các thông báo cam kết thay vì sử dụng thông báo tải mặc định. – Samuel

+0

Cảm ơn, tôi có quyền truy cập vào kho lưu trữ - vì vậy tôi sẽ cung cấp cho ảnh này. – leftend

2

Tôi không tin rằng bạn có thể thực hiện điều khiển từ xa (nghĩa là, không có bản sao cục bộ). Nhưng điều này sẽ hoạt động: svn export thư mục từ máy chủ gốc, sau đó svn add thư mục đó tới kho lưu trữ mới của bạn.

Giống như:

$ svn checkout svn://example.net/newrepo . 
$ svn export svn://example.com/oldrepo/mydir ./mydir 
$ svn add ./mydir; svn commit 

Edit: D'oh, này giảm xuống lịch sử. Sử dụng svnadmin làm Samuel describes.

+3

điều này không giữ tất cả các sửa đổi, mà ông cần phải bảo tồn .. –

+3

Tuy nhiên, bạn không thể giữ các sửa đổi mà không truy cập vào kho lưu trữ chính nó. Nếu bạn chỉ có thể có một bản sao làm việc, đây là điều tốt nhất mà anh ấy có thể làm. – Samuel

5

Điều này được thảo luận trong tài liệu SVN. Kiểm tra phần Repository Maintenance trên svndumpfilter ... Nó mô tả cụ thể cách đưa các dự án ra khỏi kho lưu trữ trung tâm và chuyển chúng vào các kho lưu trữ mới, riêng biệt.

28

svndumpfilter có lỗ hổng nghiêm trọng - nếu tệp hoặc đường dẫn được sao chép từ đường dẫn bạn lọc ra theo đường dẫn bạn đang lọc, svndumpfilter sẽ không thể điền vào lịch sử và công việc sẽ thất bại.

Bạn có thể sử dụng svndumpfilter2 nếu bạn gặp sự cố này.

+3

Đây là liên kết tốt hơn cho svndumpfilter2: http://svn.tartarus.org/sgt/svn-tools/svndumpfilter2 – bmaupin

+0

Bạn có thể thêm vào trường hợp đó đường dẫn cần thiết vào danh sách ... càng cụ thể càng tốt ... và sau đó xóa các mục nhập đó khỏi dự án sau khi nhập. –

2

Để tham khảo trong tương lai:

tài liệu SVN báo cáo rõ ràng:

Nếu bạn có kế hoạch về việc tự chỉnh sửa các tập tin dump để loại bỏ một thư mục cấp cao nhất, đảm bảo soạn thảo của bạn không được thiết lập để tự động chuyển đổi cuối các ký tự dòng trên định dạng gốc (ví dụ: \ r \ n thành \ n), vì nội dung sẽ không đồng ý với siêu dữ liệu. Điều này sẽ làm cho tệp kết xuất vô ích.

Sử dụng sed hoặc Vim để thay thế thư mục cấp cao nhất, nhưng tên thư mục này cũng được chứa trong tệp dự án !!!! Điều này gây ra lỗi kiểm tra tải SVN.

Vì vậy, khi bạn thực hiện thao tác này, không thực hiện thay thế chuỗi bằng sed chỉ tên đường dẫn.

Thay thế “Node-path: old_path” bằng “Node-path: new_path”. Xem SVN cuốn sách chương 5 "quản lý kho" để biết thêm chi tiết.

1

Tôi đã cố gắng sử dụng câu trả lời được chấp nhận, nhưng tôi đã có một kho lưu trữ lớn và tôi muốn xuất một thư mục nhỏ, và tôi không đủ khả năng để đổ toàn bộ kho lưu trữ.

Vì vậy, tôi chỉ xuất các sửa đổi mà thư mục của tôi đã thay đổi (Điều này có thể không hoạt động nếu thư mục bạn muốn xuất có tham chiếu đến các địa điểm khác trong kho lưu trữ của bạn).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt 
#tac for revisions in reverse (oldest revision first) 
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done 

#You don't have to filter if you commited only files in your directory docs in your exported revisions 
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops <./docs_revisions.dump> ./docs_only.dump 

svnadmin load /svn/new_repos < ./docs_only.dump 

Bạn phải thay thế URL của bạn repo (URL_to_docs), vị trí trong máy chủ (/svn/old_repo) và đường dẫn đến tài liệu trong kho lưu trữ (path/to/docs)

Bạn có thể dễ dàng chỉnh sửa của bạn docs_only.dump nếu bạn muốn thay đổi vị trí của thư mục doc của bạn trong kho lưu trữ mới của bạn.

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