Làm thế nào để tạo đúng thẻ SVN từ thân cây?


282

Tôi đang tạo dự án đầu tiên của tôi trong Subversion . Cho đến nay tôi có

 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 số ít và bắt đầu lại. Cập nhật chi nhánh là chuẩn mực.

Tôi đã làm việc trong thân cây và 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 bằng cách sử dụng svn copy. Các tệp 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 rằng 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 tin cá nhân?

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?

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

10
Thật không may, tôi không đưa ra 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

Câu trả lời:


186

Bạn đúng ở chỗ không "đúng" khi thêm tệp vào thư mục thẻ.

Bạn đã đoán chính xác đó copylà thao tác sử dụng; nó cho phép Subversion theo dõi lịch sử của các tệp này và cũng (tôi giả sử) 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à thực hiện các bản sao ("ảnh chụp nhanh") của toàn bộ dự án, tức là tất cả các tệp từ vị trí thanh toán gốc. Bằng cách đó, ảnh chụp nhanh có thể tự đứng vững, như một đại 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ể.

Phần này của "cuốn sách" cho thấy cách sử dụng lệnh thường.


15
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: svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Quinn Taylor

1
các tệp được sao chép không tiêu tốn thêm dung lượng
Carlos

424

Sử dụng:

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

Tốc ký:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"

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

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

4
Chỉ là một FYI, đảm bảo rằng url của bạn phù hợp với kho lưu trữ của bạn bao gồm http hoặc https.
Norman H

2
Tại sao \ ở cuối dòng đầu tiên?
Fractaliste

1
@Jonny Tôi không thể chạy lệnh trên mà không có tùy chọn "-m". Tôi đang sử dụng thiết bị đầu cuối trên mac.
Abdurrahman Mubeen Ali

14

Theo ghi nhận của @victor hugo, cách "thích hợp" là sử dụng bản sao svn. Có một cảnh báo mặc dù. "Thẻ" được tạo theo cách đó sẽ không phải là một thẻ thực sự, nó sẽ là một bản sao chính xác của bản sửa đổi được chỉ định, nhưng bản thân nó sẽ là một bản sửa đổi khác. 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ố có được với 'thông tin svn' vào phiên bản của sản phẩm bạn xây dựng), 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ó sự sửa đổi của thẻ thay vì mã gốc).

Có vẻ như theo thiết kế, không có cách nào trong svn để tạo ra một thẻ meta thực sự phù hợp.


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

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

1
Đúng, bạn đúng về Last Changed Rev, nhưng điều đó không thay đổi thực tế là theo thiết kế không có thẻ thực trong Subversion.
Alexander Amelkin

@ 18446744073709551615: Bạn có thể tránh sử dụng awkvà lấy thông tin đó trực tiếp từ svn bằng cách sử dụng --show-itemtùy chọn:svn info --show-item last-changed-revision
Luchostein

12

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"

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

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


Bạn có thể giải thích nó trông như thế nào nếu tôi chỉ kiểm tra từ thân cây và tôi đang ở trong kịch bản của mình.
aholenameich

Nếu bạn đã kiểm tra thư mục trung kế, 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 để thể hiện điều này vì kiểm tra thư mục trung kế là mẫu được đề xuất.
AgilePro

Câu trả lời này khác với câu trả lời như thế nào?
Daniel W.


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, HÃY THƯỞNG các phần 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 bên ngoài (cho dù thẻ, hoặc ĐẦU hoặc số) sẽ không thay đổi khi bạn gắn thẻ thư mục có tham chiếu bên ngoài.

Có thể tạo một tập lệnh để xử lý khía cạnh này của việc gắn thẻ, để thảo luận về chủ đề đó, hãy xem bài viết SO này: Gắn thẻ thanh toán SVN với bên ngoài


5

Một tùy chọn khác để gắn thẻ kho lưu trữ Subversion là thêm thẻ vào thuộc tính svn: log 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 các bản sửa đổi bổ sung (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 đầu ra "svn log":

   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, theo cách này bạn có thể xóa các thẻ một cách liền mạch nếu bạn cần. Vì vậy, các thẻ trở thành một thông tin meta hoàn chỉnh, và tôi thích nó.


0
svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

Tất cả bạn phải làm thay đổi đường dẫn URL. Lệnh này sẽ tạo thư mục mới "tagDestination". Dòng thứ hai sẽ cho bạn biết chi tiết lỗi đầy đủ nếu có xảy ra. Tạo biến env svn nếu không được tạo. Có thể kiểm tra (Cmd: - set, Powershell: - Get-ChildItem Env :) Đường dẫn mặc định là "C: \ Chương trình tập tin \ TortoiseSVN \ bin \ TortoiseProc.exe"


-4

Thử cái này. Nó hoạt động với 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"

1
Đây chắc chắn là một cách sai lầm để đi. Thẻ (Release1.0) phải là bản sao của thư mục nguồn (thân cây), không phải là thư mục được tạo tùy ý. Nếu bạn làm theo cách bạn đã làm, bạn sẽ mất lịch sử của chính thư mục nguồn và chỉ giữ lịch sử của các nút con cháu (tệp và thư mục).
Alexander Amelkin 11/03/2015
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.