2009-05-13 23 views
22

Tôi có một kho lưu trữ Subversion lớn với gần 15 GB dữ liệu trải rộng trên ~ 500.000 tệp. Bây giờ tôi cần phải kiểm tra kho lưu trữ này đến một máy chủ từ xa mà sẽ mất nhiều ngày để hoàn thành.Làm thế nào để chuyển đổi một thư mục hiện có sang một bản sao làm việc SVN (WC) mà không thay thế các tệp cục bộ?

Máy chủ lưu trữ tôi đang kiểm tra đã có bản sao dữ liệu hoàn chỉnh trong kho lưu trữ. Nhưng nhìn thấy như các tập tin không được kiểm tra trực tiếp từ kho lưu trữ, họ không tạo thành một bản sao làm việc (không có ".svn" thư mục).

Tôi muốn tránh sao chép tất cả dữ liệu này trên mạng, đặc biệt khi nó đã tồn tại trên máy chủ đích. Có một mẹo tôi có thể sử dụng mà sẽ biến một thư mục từ trước thành một bản sao làm việc mà không thay thế các tập tin địa phương với các bản sao giống hệt nhau từ kho lưu trữ?

+0

Chỉ cần ra khỏi tò mò: Bạn giữ gì trong kho đó? Tôi đã không bao giờ nghe nói về một repo lớn này. – sleske

+2

Âm thanh thô, chủ yếu là từ được nói. – weston

+0

Điều này nghe như là "làm thế nào để có được các thư mục .svn trở lại sau khi làm sạch chúng ra" hoặc "Tôi đã làm một xuất khẩu mất vài ngày. Nhưng tôi muốn các tập tin .svn, quá ..." – lilbyrdie

Trả lời

3

Có lệnh di dời: http://svnbook.red-bean.com/en/1.1/re27.html

EDIT: Nếu các tập tin địa phương không được liên kết với một kho lưu trữ sau đó bạn có thể tạo ra một kho lưu trữ địa phương, nhập dữ liệu vào nó và sau đó sử dụng lệnh di dời.

Hoặc nếu bạn có quyền truy cập vật lý vào cả hai máy, bạn có thể kiểm tra kho lưu trữ cục bộ và sau đó sao chép tệp vào máy từ xa qua HD bên ngoài.

+0

Tôi không thấy làm thế nào bạn có thể sử dụng di dời ở đây. di chuyển chỉ cập nhật metada trong thư mục .svn. Không có thư mục .svn theo OP. –

+0

Xem bản chỉnh sửa của tôi để giải quyết vấn đề này. –

+1

Tôi nghi ngờ điều này sẽ làm việc, bởi vì bạn chỉ có thể di chuyển đến một kho lưu trữ với cùng một kho UID –

0

Bạn chỉ có thể kiểm tra kho lưu trữ cục bộ, sau đó chỉ chuyển các thư mục .svn (cẩn thận, chúng chứa các bản sao của các tệp không gian làm việc, rõ ràng là bạn không muốn sao chép chúng). Điều đó sẽ hoạt động, vì bạn sẽ có các tệp chính xác của bản sao làm việc chính xác.

Tất nhiên bạn phải viết một số loại tập lệnh để truyền tệp .svn. Trên một hệ thống Unix, bạn có thể làm điều đó với tìm kiếm và bạn bè.

+0

-1 Nếu anh ta có khoảng 500.000 tập tin tưởng tượng để di chuyển tất cả các thư mục .svn 'cẩn thận'? –

+1

Tất nhiên bạn sẽ sử dụng một số tập lệnh. "Cẩn thận" là cảnh báo về một vấn đề tiềm ẩn khi viết một kịch bản như vậy. – sleske

+0

Tôi đã xem xét điều này, nhưng như Victor đã chỉ ra điều này có thể khá tẻ nhạt với một repo lớn như vậy. Ngoài ra, thư mục ".svn/text-base" của bản sao làm việc chứa các bản sao nguyên sơ của tất cả các tệp trong repo, vì vậy ngay cả việc sao chép chỉ các thư mục .svn vẫn sẽ yêu cầu một bản sao đầy đủ của dữ liệu. – weston

0

Tôi không tin có giải pháp mà không chuyển 15 GB đó đến đích. Nó có lẽ sẽ nhanh hơn và dễ dàng hơn để sao chép kho lưu trữ ở đó và thực hiện thanh toán cục bộ.

+0

Vâng, vui bạn đề nghị điều này bởi vì tôi đã cố gắng kiểm tra ra chỉ là một bản sao làm việc địa phương trên máy chủ chính nó. Ngay cả một thanh toán địa phương cũng mất hơn một ngày để hoàn thành và điều này sẽ không bao gồm thời gian cần thiết để đổ/sao chép/tải vào một kho lưu trữ mới trên máy chủ từ xa. – weston

+0

Nó có thể có nghĩa là lật đổ không phải là công cụ phù hợp với bạn ... – Gleb

1

Bạn có thể thử sử dụng rsync nếu bạn đã có một bản sao làm việc trong điều khiển svn ở một nơi khác trên mạng.

+0

Đây không phải là một ý tưởng tồi nhưng, như đã đề cập trong một nhận xét khác, thư mục .svn/text-base chứa các bản sao nguyên sơ của tất cả các tệp repo của bạn , vì vậy rsync sẽ kết thúc sao chép tất cả các dữ liệu trên anyway. Bạn có thể nói rsync bỏ qua việc sao chép "text-base" và sau đó viết một cái gì đó để điền vào "text-base" khi thư mục .svn được đồng bộ hóa. – weston

0

Không có lệnh svn gốc nào sẽ kiểm tra các tệp hiện có cho phù hợp và không tải chúng xuống.

Bạn đang sử dụng giao thức nào để truy cập kho lưu trữ? Nếu đó là https, đó có thể là vấn đề của bạn. Hãy thử giao thức svn gốc (sử dụng svnserve), hoặc svn + ssh. Hoặc thậm chí có thể thực hiện thanh toán qua một tệp: // URL trên máy chủ lưu trữ repo svn và sử dụng rsync để chuyển qua mạng.

Miễn là bạn không phải là thanh toán cho băng thông trên mỗi byte, điều đó có nghĩa là hãy để "svn co --force" chạy dưới dạng đẹp hoặc (START/LOW trên Windows) và không lãng phí thời gian. Nó sẽ không làm bất cứ điều gì trên hệ thống tập tin cục bộ không có sẵn trong quá trình thanh toán.

Cuối cùng, tôi không thể tìm ra lý do thanh toán của bạn quá chậm ... chúng tôi có kho lưu trữ tệp 500K thanh toán trong ~ 6 phút qua https trên mạng LAN gigabit. Cấp tất cả các tệp nhỏ hơn nhiều (tổng số 1 GB). Làm thế nào xa máy chủ là bạn về độ trễ?

0

Thực hiện thanh toán trên máy chủ, tạo bản sao làm việc cục bộ (cục bộ đến máy chủ), sau đó rsync bản sao làm việc đó vào hệ thống từ xa qua cấu trúc thư mục hiện có.

Sử dụng Subversion 1.7, theo cách đó không có .svn với các bản sao nguyên sơ của tệp.

1

Lệnh sau đây là xóa tất cả thư mục .svn.

chmod -R 0755 project_dir 
find /project_dir -type d -name .svn -exec rm -rf '{}' + 

Nếu bạn đã có một phiên bản thanh toán, bạn có thể cố gắng sao chép những .svn thư mục bằng cách thay thế rm với cp. Tôi đã không thử.

0

Tôi đã có một kho lưu trữ làm việc trên máy tính cục bộ của mình có tất cả các thư mục .svn bị xóa khi Eclipse gặp sự cố.

Cách duy nhất tôi đã có thể kết nối nó với kho SVN từ xa đã làm theo các bước từ một blog tôi thấy (Recovering a broken Subversion working copy):

# Backup your project in case you run into trouble 
cp -Rp /path/to/project /temporary/location 

# Strip out the old .svn folders (if any) 
find /path/to/project -name .svn -print0 | xargs -0 rm -rf 

# Check out a clean copy 
svn co http://repo/location /temporary/location2 

# Move the .svn folders from the clean copy into the correct relative 
# place in the broken copy 
cd /temporary/location2 
find . -name .svn -print0 | xargs -0 -I {} mv '{}' '/path/to/project/{}' 

# Remove the clean copy 
rm -rf /temporary/location2 
23

Tính đến SVN 1,7 (nhưng không phải trước đó) bạn có thể làm điều này một cách dễ dàng với:

svn co --force http://path/to/repo

này sẽ tôn trọng bản sao cục bộ như hiện có, và bạn sẽ thấy chữ "E" cho hiện tại trước mỗi tên file trong đầu ra: 01.E some/existing/file

Nếu tập tin là khác nhau (mới hoặc sửa đổi) từ kho lưu trữ nó sẽ xử lý mà duyên dáng quá theo the book:

Trước khi phiên bản 1.7, Subversion sẽ phàn nàn theo mặc định nếu bạn cố gắng để kiểm tra ra một thư mục trên đỉnh một thư mục hiện có chứa các tệp hoặc thư mục con mà chính thanh toán đã tạo. Subversion 1.7 xử lý tình huống này một cách khác nhau, cho phép thanh toán tiến hành nhưng đánh dấu bất kỳ đối tượng cản trở nào là xung đột cây. Sử dụng tùy chọn --force để ghi đè biện pháp bảo vệ này. Khi bạn kiểm tra với tùy chọn --force, bất kỳ tệp không phiên bản nào trong cây mục tiêu kiểm tra mà thông thường sẽ cản trở việc thanh toán sẽ vẫn được phiên bản, nhưng Subversion sẽ giữ nguyên nội dung của nó. Nếu những nội dung đó khác với tệp kho lưu trữ ở đường dẫn đó (được tải xuống như một phần của thanh toán), tệp sẽ xuất hiện để sửa đổi cục bộ — các thay đổi cần thiết để chuyển đổi tệp đã phiên bản mà bạn đã kiểm tra vào tệp không phiên bản mà bạn đã có trước khi kiểm tra ra - khi thanh toán hoàn tất.

Cũng lưu ý rằng SVN 1.7 có thể dẫn đến các tình huống mà đây là vấn đề phổ biến hơn (có thể thúc đẩy giải pháp). Tôi đã gặp sự cố này khi di chuyển một thư mục phụ sub đến một vị trí mới trên đĩa. Trong 1.7 trước đó có thể đã di chuyển các thư mục .svn với nó và nó sẽ có đứng một mình tốt. Trong 1.7 thư mục đã trở nên hiệu quả không phiên bản. Nhưng svn co --force đã lưu trong ngày.

+0

Tuy nhiên, phần bổ sung này vào thư mục cục bộ, các tệp nằm trong kho lưu trữ (nếu chúng không được tìm thấy cục bộ). Làm thế nào tôi có thể tránh điều này? và nói với svn: đây là bản sao làm việc mới, đối phó với nó! – yota

0

svn co --force https://PATH/TO/REPO/ .

Trường hợp . ở cuối giả sử bạn đã ở trong thư mục mà bạn muốn chuyển thành một bản sao SVN làm việc.

Đối với trường hợp, nếu bạn muốn tạo thư mục public_html bạn một bản sao svn làm việc của một kho lưu trữ:

cd /home/username/public_html; svn co --force https://PATH/TO/REPO/ .

+1

Câu trả lời này tốt hơn câu trả lời hiện được chấp nhận, có chứa thông tin như thế nào? –

+0

Câu trả lời được chấp nhận bỏ qua tầm quan trọng của biểu thức rõ ràng của thư mục hiện tại. –

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