2009-05-12 28 views
256

Tôi đang tạo dự án đầu tiên của mình theo số Subversion. Cho đến nay tôi cóCách tạo thẻ SVN đúng cách từ thân cây?

branches 
tags 
trunk 

Tôi nghĩ rằng tôi ngay lập tức cần phải làm cho các chi nhánh ít và bắt đầu lại. Cập nhật chi nhánh là tiêu chuẩn.

Tôi đã làm việc trong thân cây và di chuyển nội dung sang các thẻ như sau.

mkdir tags/1.0 
cp -rf trunk/* tags/1.0 
svn add tags/1.0 
svn commit -m " create a first tagged version" 

ruột của tôi nói với tôi điều này là hoàn toàn sai, và tôi nên duy trì một số mối quan hệ giữa các tập tin sử dụng svn copy. Các tập tin tôi tạo theo cách này sẽ không có mối quan hệ với nhau, và tôi chắc chắn tôi sẽ bỏ lỡ các tính năng Subversion. Tôi có đúng không?

Tôi có nên sử dụng bản sao svn cho các tệp riêng lẻ không?

mkdir tags/1.0 
svn add tags/1.0 
svn copy trunk/file1 tags/1.0 
svn copy trunk/file2 tags/1.0 
svn copy trunk/file3 tags/1.0 
svn commit -m " create a first tagged version" 

Tôi có nên sử dụng bản sao svn trên toàn bộ thư mục không?

svn copy cp -rf trunk tags/1.0 
svn commit -m " create a first tagged version" 
+10

Thật không may là tôi không thực hiện tất cả các lựa chọn trong trường hợp này ... git là ma thuật khá chết tiệt. – ojblass

Trả lời

178

Bạn đang đúng ở chỗ nó không phải là "đúng" để thêm tệp vào thư mục thẻ.

Bạn đã đoán chính xác rằng copy là hoạt động để sử dụng; nó cho phép Subversion theo dõi lịch sử của những tập tin này, và cũng có thể (tôi giả định) lưu trữ chúng hiệu quả hơn nhiều.

Theo kinh nghiệm của tôi, tốt nhất là sao chép ("ảnh chụp nhanh") của toàn bộ dự án, nghĩa là tất cả các tệp từ vị trí trả phòng gốc. Bằng cách đó, ảnh chụp có thể tự đứng vững, như là một biểu diễn thực sự của toàn bộ trạng thái của dự án tại một thời điểm cụ thể.

This part of "the book" cho biết cách lệnh thường được sử dụng.

+14

Phiên bản 1.1 của cuốn sách đã lỗi thời khủng khiếp. Đây là một liên kết tốt hơn: http://svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html –

+1

các tệp được sao chép không tốn thêm bất kỳ không gian nào – Carlos

387

Chỉ cần chắc

svn copy http://svn.example.com/project/trunk \ 
     http://svn.example.com/project/tags/1.0 -m "Release 1.0" 
+33

Tôi đã đánh dấu phần này là câu trả lời. Chỉ cần một lưu ý thêm. Bạn có thể nhận được bản sửa đổi trước đó của thân cây và "gắn thẻ" nó. lệnh: svn copy -r 123 "http://svn.example.com/project/trunk" "http://svn.example.com/project/tags/1.0" -m "Gắn thẻ, nhưng sử dụng bản sửa đổi cũ hơn (123). " – granadaCoder

+4

Tôi nhận được ** svn: Các hoạt động cục bộ, không cam kết không nhận thông báo tường trình hoặc các thuộc tính sửa đổi **, vì vậy tôi chỉ cần xóa tùy chọn -m. – Jonny

+4

Chỉ cần một FYI, hãy đảm bảo rằng url của bạn khớp với kho lưu trữ của bạn bao gồm http hoặc https. –

12

Theo ghi nhận của @victor hugo, cách "đúng đắn" là sử dụng bản sao svn. Mặc dù vậy, có một báo trước. "Thẻ" được tạo theo cách đó sẽ không phải là thẻ thực sự, nó sẽ là bản sao chính xác của bản sửa đổi được chỉ định, nhưng nó sẽ khác nhau bản sửa đổi. Vì vậy, nếu hệ thống xây dựng của bạn sử dụng sửa đổi svn bằng cách nào đó (ví dụ: kết hợp số thu được với 'thông tin svn' vào phiên bản sản phẩm bạn tạo), thì bạn sẽ không thể xây dựng chính xác cùng một sản phẩm từ thẻ (kết quả sẽ có bản sửa đổi của thẻ thay vì của mã số gốc).

Dường như theo thiết kế, không có cách nào trong svn để tạo thẻ meta thực sự thích hợp.

+4

Có thể sử dụng "Lần thay đổi cuối cùng": '' ' echo "{'svnRev': \" 'svn thông tin | awk '/ Last Changed Rev:/{print $ 4}' '\"} "> svnver.txt''' ' – 18446744073709551615

+0

Bằng cách này, hai nhánh có (tất nhiên) các số phiên bản khác nhau vẫn tạo ra cùng một phiên bản phần mềm. – 18446744073709551615

+1

Có, bạn đang đúng về Rev thay đổi lần cuối, nhưng điều đó không thay đổi thực tế là do thiết kế không có thẻ thực trong Subversion. –

7

@victor hugo và @unwind là chính xác và giải pháp của người chiến thắng là đơn giản nhất. Tuy nhiên BEWARE của các bên ngoài trong dự án SVN của bạn. Nếu bạn tham chiếu các thư viện bên ngoài, tham chiếu sửa đổi của bên ngoài (cho dù thẻ, hoặc HEAD hay số) sẽ vẫn không thay đổi khi bạn gắn thẻ các thư mục có tham chiếu bên ngoài.

Nó có thể tạo ra một kịch bản để xử lý các khía cạnh này của tagging, cho một cuộc thảo luận về chủ đề đó, hãy xem SO Bài chi tiết: Tagging an SVN checkout with externals

-3

Hãy thử điều này. Nó làm việc cho tôi:

mkdir <repos>/tags/Release1.0 
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0 
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0" 
+0

Đây chắc chắn là một cách sai đi. Thẻ (Release1.0) phải là một bản sao của thư mục nguồn (trunk), không phải là một thư mục được tạo tự ý. Nếu bạn làm điều đó theo cách bạn đã làm, bạn mất lịch sử của thư mục nguồn chính nó và chỉ giữ lịch sử của các nút hậu duệ (tệp và thư mục). –

11

Chỉ cần sử dụng này:

svn copy http://svn.example.com/project/trunk 
      http://svn.example.com/project/branches/release-1 
      -m "branch for release 1.0" 

(trên cùng một dòng, tất nhiên.) Bạn nên luôn luôn làm cho một chi nhánh của toàn bộ thư mục thân và nội dung. Tất nhiên là có thể nhánh nhánh của thân cây, nhưng điều này hầu như không bao giờ là một thực hành tốt. Bạn muốn nhánh này cư xử chính xác như thân cây hiện tại, và điều đó xảy ra bạn phải nhánh toàn bộ thân cây.

Xem một bản tóm tắt tốt hơn về việc sử dụng SVN tại blog của tôi: SVN Essentials, và SVN Essentials 2

+0

Bạn có thể xây dựng nó trông như thế nào nếu tôi chỉ checkoput từ thân cây và tôi đang ở bên trong với tập lệnh của tôi. – aholbreich

+0

Nếu bạn đã kiểm tra thư mục thân, thì bạn cần sử dụng địa chỉ http của kho lưu trữ. Tôi đã cập nhật câu trả lời để đại diện cho điều này vì việc kiểm tra thư mục thân là mẫu được đề xuất. – AgilePro

4

Một tùy chọn khác để gắn thẻ một kho lưu trữ Subversion là thêm các thẻ vào svn: đăng nhập tài sản như thế này:

echo "TAG: your_tag_text" > newlog 
    svn propget $REPO --revprop -r $tagged_revision >> newlog 
    svn propset $REPO --revprop -r $tagged_revision -F newlog 
    rm newlog 

Gần đây tôi đã bắt đầu nghĩ rằng đây là cách "đúng" nhất để gắn thẻ. Bằng cách này bạn không tạo ra các phiên bản phụ (như bạn làm với "svn cp") và vẫn có thể dễ dàng trích xuất tất cả các thẻ bằng cách sử dụng grep trên "svn log" đầu ra:

svn log | awk '/----/ { 
         expect_rev=1; 
         expect_tag=0; 
        } 
        /^r[[:digit:]]+/ { 
         if(expect_rev) { 
          rev=$1; 
          expect_tag=1; 
          expect_rev=0; 
         } 
        } 
        /^TAG:/ { 
         if(expect_tag) { 
          print "Revision "rev", Tag: "$2; 
         } 
         expect_tag=0; 
        }' 

Ngoài ra, bằng cách này bạn có thể liên tục xóa thẻ nếu bạn cần. Vì vậy, các thẻ trở thành một siêu thông tin hoàn chỉnh và tôi thích nó.

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