Làm cách nào để di chuyển một thư mục từ kho lưu trữ Subversion sang kho lưu trữ khác?


156

Tôi có một thư mục "docs" trong kho 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ữ trong một kho lưu trữ Subversion riêng có tên là "project_docs".

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

Câu trả lời:


183

Nếu bạn có quyền truy cập vào kho lưu trữ (không phải là bản sao hoạt động), bạn sẽ có thể kết xuất 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

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 việc sao chép các tệp vào kho lưu trữ mới và cam kết.


1
Ví dụ tốt đẹp. 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 sửa đổi để không có "trống rỗng". Một cái gì đó để ghi nhớ nếu bạn tham khảo các sửa đổi tài liệu bất cứ nơi nào khác.
Adam Bellaire

1
Tôi đã đề nghị loại bỏ 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 điệp cam kết thay vì sử dụng tải mặc định.
Samuel

11
Cảm ơn câu trả lời. Trong trường hợp bất cứ ai cần biết, nếu bạn cần nhiều hơn thì một thư mục chỉ cần đặt một khoảng trắng giữa chúng trong danh sách bao gồm. Ví dụ. ... bao gồm thư mụcOne thư mụcTwo
Robin Robinson

6
Làm mới các sửa đổi có lẽ là một ý tưởng tồi, vì các thông điệp cam kết và các công cụ theo dõi vấn đề có thể đề cập đến chúng
Wim Coenen

5
Điều này làm việc cho tôi. Tôi là người dùng windows (Visual SVN Server) và lệnh đầu tiên của tôi trông như thế này, nếu nó giúp được bất cứ ai:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

svndumpfilter có một lỗ hổng nghiêm trọng - nếu một tệp hoặc đường dẫn được sao chép từ một đường dẫn bạn đang lọc sang một đường dẫn bạn đang lọc, thì 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ể dùng svndumpfilter2 nếu bạn gặp vấn đề này.


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

Trong trường hợp đó, bạn có thể thêm đườ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 đó khỏi dự án sau khi nhập.
James Gawron

6

Điều này được thảo luận trong tài liệu SVN. Kiểm tra phần Bảo trì kho lưu trữ trên svndumpfilter... Nó mô tả cụ thể cách loại bỏ 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.


2

Tôi không tin rằng bạn có thể làm điều đó từ xa (tức là không có bản sao địa phương). Nhưng điều này sẽ hoạt động: svn exportthư mục từ máy chủ gốc, sau đósvn add đó đến thư mục mới của bạn.

Giống:

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

Chỉnh sửa: D'oh, điều này làm giảm lịch sử. Sử dụng svnadminnhư Samuel mô tả .


3
Tuy nhiên, bạn không thể giữ bản sửa đổi mà không truy cập vào kho lưu trữ. 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 anh ta có thể làm.
Samuel

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 chỉnh sửa thủ công tệp kết xuất để xóa thư mục cấp cao nhất, hãy đảm bảo trình chỉnh sửa của bạn không được đặt để tự động chuyển đổi các ký tự cuối dòng thành định dạng gốc (ví dụ: \ r \ n thành \ n), vì nội dung sau đó sẽ không đồng ý với siêu dữ liệu. Điều này sẽ khiến tập tin kết xuất vô dụng.

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 một 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, đừng thực hiện thay thế chuỗi bằng sed chỉ tên đường dẫn.

Thay thế đường dẫn Node-path: old_path Cảnh với đường dẫn Node-new: new_path. Xem sách SVN chương 5 quản trị kho lưu trữ của Google để 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ữ khổng lồ 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 bản sửa đổi trong đó 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 vị trí khác trong repo 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 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 docs_only.dumpnếu bạn muốn thay đổi vị trí của thư mục doc trong kho lưu trữ mới của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.