2008-11-04 41 views
21

Via dòng lệnh, tôi thường làm điều này:Trong SVN, làm cách nào để sao chép chỉ các thư mục con của một thư mục vào một thư mục khác?

cp -rRp /path/to/a\_folder/. /path/to/another\_folder 

bản này chỉ là nội dung bên dưới a_folder để another_folder. Trong SVN tôi cần phải làm điều tương tự, nhưng không thể hiểu được. Tôi luôn luôn kết thúc với điều này:

/path/to/another\_folder/a\_folder 

SVN ném lên ngay cả khi tôi cố gắng này:

svn copy file:///path/to/a\_folder/* file:///path/to/another\_folder 

Nó nói nó không tồn tại.

EDIT:

này có lẽ sẽ giúp đỡ. Cấu trúc thư mục cho dự án của tôi trông giống như sau:

my_project 
    /branches 
    /tags 
    /trunk 
    /vendor 
    /1.1 

Tôi cần lấy nội dung 1.1 dưới nhà cung cấp vào thân mà không thực sự sao chép thư mục 1.1.

Trả lời

8

Bạn đã cân nhắc sử dụng hợp nhất svn chưa?

Cho một repo như thế này:

trunk/a_folder/foo 
trunk/a_folder/bar 
trunk/new_folder/baz 

sử dụng các lệnh này để hợp nhất foo và bar thư mục:

cd trunk/new_folder 
svn merge -r1:HEAD http://svn/repo/trunk/a_folder . 
1

Bạn đang rất, rất gần:

svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder 

chỉ cần bỏ số /* từ đối số đầu tiên.

19

Như bạn đã chắc chắn phát hiện, sao chép vào một thư mục mục tiêu đó đã tồn tại sẽ không làm việc:

svn cp svn://my_project/vendor/1.1 svn://my_project/trunk

vì thân cây đã tồn tại, vì vậy bạn muốn kết thúc với:

Sử dụng hợp nhất có đặc tính không đáng tiếc là không giữ lịch sử của thẻ nhà cung cấp 1.1 trong phiên bản lật đổ trước 1.5 cho phép theo dõi hợp nhất. Bạn có thể không quan tâm. Trong trường hợp này hợp nhất sẽ là giải pháp đúng:

 
svn co svn://my_project/trunk trunk-wc 
svn merge svn://my_project/trunk svn://my_project/vendor/1.1 trunk-wc 

Cách tốt nhất để đọc merge này là: Đầu tiên xác định những thay đổi cần thiết để làm cho trunk giống vendor/1.1, sau đó áp dụng những thay đổi đối với bản sao làm việc nhất định (cũng của thân cây, trong trường hợp này).

Tôi nên chỉ ra rằng quá trình hợp nhất này sẽ loại bỏ hiệu quả mọi thứ nằm trong thân cây trước đó. Vì vậy, nếu bạn đã sửa đổi cục bộ (không phải nhà cung cấp) đã có trên thân cây, bạn sẽ chỉ muốn áp dụng các thay đổi giữa 1.1 và thả nhà cung cấp theo thời gian:

 
svn co svn://my_project/trunk trunk-wc 
svn merge svn://my_project/vendor/1.0 svn://my_prjoect/vendor/1.1 trunk-wc 

Nếu thân tồn tại, nhưng trống bạn đã có hai lựa chọn: thay thế các thân cây, hoặc viết một chút vòng vỏ:

Thay thế thân trông như thế này:

 
svn rm svn://my_project/trunk 
svn cp svn://my_project/vendor/1.1 svn://my_project/trunk 

Tận dụng vỏ (bash):

012.
 
svn co svn://my_project/trunk trunk 
svn co svn://my_project/vendor/1.1 1.1 
(cd 1.1 
    for x in * ; do 
    svn cp $x ../trunk 
    done 
) 
svn ci trunk 
3

Tôi nghĩ rằng những gì bạn muốn là nội dung của thân cây kết thúc trong thư mục /tags/version-1.0/ mà không có thêm thư mục /trunk ở đó. tức là điều này là xấu: /tags/version-1.0/trunk/stuff. Điều này là tốt: /tags/version-1.0/stuff.

Để có được điều này tôi làm một quá trình 2 bước:

svn copy http://localhost/MyProject/trunk http://localhost/MyProject/tags/ 

# now I have /MyProject/tags/trunk 

svn rename http://localhost/MyProject/tags/trunk http://localhost/MyProject/tags/version-1.0 
5

liên kết này giải thích một cách giải quyết.

http://svn.haxx.se/users/archive-2004-12/1537.shtml

Về cơ bản những gì nó nói là nếu thư mục đích không tồn tại trong repo, bạn sẽ nhận được contencts của thư mục nguồn của bạn trong thư mục đích.

Xem ví dụ bên dưới. Thư mục 07-03-2012 không tồn tại trong kho lưu trữ của bạn. Khi bạn thực hiện lệnh dưới đây, bạn sẽ nhận được nội dung của thư mục HEAD trong 07-03-2012.

svn cp <URL>/HEAD/ <URL>/branches/07-03-2012 -m "test" 
Các vấn đề liên quan