2008-09-21 42 views

Trả lời

14
svn info <Repository-URL> 

hoặc

svn info --xml <Repository-URL> 

Sau đó nhìn vào kết quả. Đối với xml, phân tích cú pháp/thông tin/mục nhập/sửa đổi cho bản sửa đổi của kho lưu trữ (151 trong ví dụ này) hoặc/info/entry/commit/@ revision để sửa đổi cam kết cuối cùng chống lại đường dẫn này (133, hữu ích khi làm việc với tags):

<?xml version="1.0"?> 
<info> 
<entry 
    kind="dir" 
    path="cmdtools" 
    revision="151"> 
<url>http://myserver/svn/stumde/cmdtools</url> 
<repository> 
<root>http://myserver/svn/stumde</root> 
<uuid>a148ce7d-da11-c240-b47f-6810ff02934c</uuid> 
</repository> 
<commit 
    revision="133"> 
<author>mstum</author> 
<date>2008-07-12T17:09:08.315246Z</date> 
</commit> 
</entry> 
</info> 

tôi đã viết một công cụ (cmdnetsvnrev, mã nguồn kèm theo) cho bản thân mình mà thay thế sửa đổi trong các tập tin AssemblyInfo.cs của tôi. Nó được giới hạn cho mục đích đó mặc dù, nhưng thông thường svn và sau đó chế biến là con đường để đi.

1

Vâng, bạn có thể chạy 'thông tin svn' để xác định số phiên bản hiện tại và bạn có thể trích xuất khá dễ dàng với một regex, như "Bản sửa đổi: ([0-9] +)".

+0

'svn info | sed -n 's/^ Revision: // p'' – tripleee

7

Nếu bạn có con rùa SVN bạn có thể sử dụng SubWCRev.exe

Tạo một tập tin gọi là:

RevisionInfo.tmpl

SvnRevision = $WCREV$; 

Sau đó thực hiện lệnh này:

SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt 

Nó sẽ tạo ra một tập tin ReivisonInfo.txt với số sửa đổi của bạn như sau:

SvnRevision = 5000; 

Nhưng thay vì sử dụng .txt bạn có thể sử dụng bất kỳ tệp nguồn nào bạn muốn và có quyền truy cập vào số reivsion trong mã nguồn của bạn.

12

Add svn: từ khóa để các thuộc tính SVN của tập tin nguồn:

svn:keywords Revision 

Sau đó, trong tập tin nguồn bao gồm:

private const string REVISION = "$Revision$"; 

Việc sửa đổi sẽ được cập nhật với số sửa đổi ở bên cạnh cam kết (ví dụ) "$Revision: 4455$". Bạn có thể phân tích chuỗi này để trích xuất chỉ số sửa đổi.

+0

Một câu hỏi về điều đó: Tôi thấy rằng $ Revision $ chỉ được cập nhật nếu tập tin cụ thể đó thay đổi, nếu không nó sẽ không bị ảnh hưởng. Có cách nào để buộc cập nhật $ Revision $ trên mỗi checkin/out, bất kể nếu tập tin đã được sửa đổi trong lần commit cuối cùng hay không? –

+0

Không, bạn phải thực hiện một thay đổi tập tin và cam kết cho điều này để làm việc. Tôi đã luôn luôn chỉ bao gồm các REVISION const trong tập tin có chứa số phiên bản hoặc phát hành ghi chú mà thường được cập nhật trước khi phát hành anyway. –

+0

Bạn sẽ làm như thế nào nếu tệp là tệp .js? – jamesfzhang

1

Nếu bạn đang chạy dưới dạng GNU/Linux, cd vào thư mục bản sao làm việc và chạy:

svn -u status | grep Status\ against\ revision: | awk '{print $4}'

Từ kinh nghiệm của tôi, svn info không đưa ra con số đáng tin cậy sau khi đổi tên thư mục.

+0

Và như mọi khi, 'grep foo | awk '{bar}' 'có thể được cấu trúc lại thành' awk '/ foo/{bar}' '-' svn -u status | awk '/ Tình trạng chống lại sửa đổi:/{print $ 4}' ' – tripleee

5

Bạn không nói ngôn ngữ lập trình/khung mà bạn đang sử dụng.Dưới đây là làm thế nào để làm điều đó bằng Python sử dụng PySVN

import pysvn 
repo = REPOSITORY_LOCATION 
rev = pysvn.Revision(pysvn.opt_revision_kind.head) 
client = pysvn.Client() 
info = client.info2(repo,revision=rev,recurse=False) 
revno = info[0][1].rev.number # revision number as an integer 
0

Bạn muốn Subversion thông tin subcommand, như sau:

$ svn info . 
Path: . 
URL: http://trac-hacks.org/svn/tracdeveloperplugin/trunk 
Repository Root: http://trac-hacks.org/svn 
Repository UUID: 7322e99d-02ea-0310-aa39-e9a107903beb 
Revision: 4190 
Node Kind: directory 
Schedule: normal 
Last Changed Author: coderanger 
Last Changed Rev: 3397 
Last Changed Date: 2008-03-19 00:49:02 -0400 (Wed, 19 Mar 2008) 

Trong trường hợp này, có hai số sửa đổi: 4190 và 3397. 4190 là số sửa đổi cuối cùng cho kho lưu trữ và 3397 là số sửa đổi của thay đổi cuối cùng đối với cây con mà không gian làm việc này đã được kiểm tra. Bạn có thể chỉ định một đường dẫn đến một vùng làm việc hoặc một URL đến một kho lưu trữ.

AC# fragment để trích xuất này trong môi trường Windows sẽ giống như thế này:

Process process = new Process(); 
process.StartInfo.FileName = @"svn.exe"; 
process.StartInfo.Arguments = String.Format(@"info {0}", path); 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.Start(); 

// Parse the svn info output for something like "Last Changed Rev: 1234" 
using (StreamReader output = process.StandardOutput) 
{ 
    Regex LCR = new Regex(@"Last Changed Rev: (\d+)"); 

    string line; 
    while ((line = output.ReadLine()) != null) 
    { 
     Match match = LCR.Match(line); 
     if (match.Success) 
     { 
      revision = match.Groups[1].Value; 
     } 
    } 
} 

(. Trong trường hợp của tôi, chúng tôi sử dụng các phiên bản Subversion là một phần của số phiên bản dành cho hội)

5

Sử dụng C# và SharpSvn (từ http://sharpsvn.net) mã sẽ là:

//using SharpSvn; 
long revision = -1; 
using(SvnClient client = new SvnClient()) 
{ 
    client.Info(path, 
    delegate(object sender, SvnInfoEventArgs e) 
    { 
     revision = e.Revision; 
    }); 
} 
31

có quá trình xây dựng của bạn gọi lệnh svnversion, và nhúng đầu ra của nó vào {source | binaries} được tạo ra. Điều này sẽ không chỉ cung cấp cho phiên bản hiện tại (như nhiều ví dụ khác ở đây), nhưng chuỗi đầu ra của nó cũng sẽ cho biết liệu một bản dựng đang được thực hiện trong một cây hỗn hợp hay cây không khớp chính xác với số sửa đổi đang được đề cập (ví dụ: một cây có thay đổi cục bộ).

Với một cây tiêu chuẩn:

$ svnversion 
3846 

Với một cây biến đổi:

$ echo 'foo' >> project-ext.dtd 
$ svnversion     
3846M 

Với một hỗn hợp sửa đổi, sửa đổi cây:

$ (cd doc; svn up >/dev/null 2>/dev/null) 
$ svnversion 
3846:4182M 
+0

bất kỳ ý tưởng làm thế nào bạn có thể làm cho nó vào danh sách các phiên bản của bất kỳ bên ngoài là tốt? – ShoeLace

+1

@ShoeLace - Không phải với svnversion, thật đáng buồn - nhưng một chút nhỏ của grep và awk làm việc trên trạng thái svn --verbose sẽ giúp bạn có được những gì bạn đang tìm kiếm. –

+0

@ShoeLace, ... btw, để cập nhật điều đó - hôm nay, tôi sẽ sử dụng 'svn status --verbose --xml', với XMLStarlet hoặc một XSLT template postprocessing. –

3

Trong dự án mới nhất của tôi, tôi giải quyết vấn đề này bằng cách sử dụng một số công cụ, SVN, NAnt, và một nhiệm vụ tùy chỉnh NAnt.

  1. Sử dụng Nant để thực hiện svn info --xml ./svnInfo.xml
  2. Sử dụng Nant để kéo số sửa đổi từ file xml với <xmlpeek>
  3. Sử dụng một tùy chỉnh Nant nhiệm vụ để cập nhật các thuộc tính AssemblyVersion trong file AssemblyInfo.cs với mới nhất với số phiên bản (ví dụ: major.minor.maintenance, revision) trước khi biên dịch dự án. phần

Phiên bản liên quan đến xây dựng kịch bản của tôi trông như thế này:

<!-- Retrieve the current revision number for the working directory --> 
<exec program="svn" commandline='info --xml' output="./svnInfo.xml" failonerror="false"/> 
<xmlpeek file="./svnInfo.xml" xpath="info/entry/@revision" property="build.version.revision" if="${file::exists('./svnInfo.xml')}"/> 

<!-- Custom NAnt task to replace strings matching a pattern with a specific value --> 
<replace file="${filename}" 
     pattern="AssemblyVersion(?:Attribute)?\(\s*?\&quot;(?&lt;version&gt;(?&lt;major&gt;[0-9]+)\.(?&lt;minor&gt;[0-9]+)\.(?&lt;build&gt;[0-9]+)\.(?&lt;revision&gt;[0-9]+))\&quot;\s*?\)" 
     value="AssemblyVersion(${build.version})" 
     outfile="${filename}"/> 

Tín dụng cho biểu thức chính quy đi vào: http://code.mattgriffith.net/UpdateVersion/. Tuy nhiên, tôi thấy rằng UpdateVersion không đáp ứng nhu cầu của tôi vì tính năng ghim bị hỏng trong bản dựng mà tôi có. Do đó nhiệm vụ tùy chỉnh NAnt.

Nếu có ai quan tâm đến mã, cho nhiệm vụ tùy chỉnh NAnt replace cho tôi biết. Vì đây là một dự án liên quan đến công việc, tôi sẽ cần phải kiểm tra với ban quản lý để xem chúng tôi có thể phát hành nó theo giấy phép thân thiện (miễn phí) không.

19

Lệnh svnversion là cách chính xác để thực hiện việc này. Nó xuất kết quả sửa đổi toàn bộ bản sao làm việc của bạn, hoặc một loạt các bản sửa đổi nếu bản sao làm việc của bạn được trộn lẫn (ví dụ: một số thư mục được cập nhật và một số thư mục không có). Nó cũng sẽ chỉ ra nếu bản sao làm việc có sửa đổi cục bộ. Ví dụ: trong một thư mục làm việc khá không rõ ràng:

$ svnversion 
662:738M 

Từ khóa $ Revision $ không thực hiện những gì bạn muốn: từ khóa chỉ thay đổi khi tệp chứa. Cuốn sách Subversion tặng more detail. Lệnh "svn info" cũng không làm những gì bạn muốn, vì nó chỉ cho bạn biết trạng thái của thư mục hiện tại của bạn, bỏ qua trạng thái của bất kỳ thư mục con nào. Trong cây làm việc tương tự như ví dụ trước, tôi đã có một số thư mục con trong đó là mới hơn so với thư mục tôi đang ở, nhưng "info svn" không nhận thấy:

$ svn info 
... snip ... 
Revision: 662 

Thật dễ dàng để kết hợp svnversion vào quá trình xây dựng của bạn , để mỗi bản dựng nhận được số sửa đổi trong một số biểu mẫu có thể truy cập thời gian chạy. Đối với một dự án Java, ví dụ, tôi đã có makefile của chúng tôi đổ đầu ra svnversion vào một tập tin .properties.

+0

Vui lòng chấp nhận lời xin lỗi của tôi về sự giảm giá hiện tại. Vào thời điểm đó, tôi đã xem xét điều này, nhưng nó bổ sung thêm nội dung mới (giải thích các hạn chế của '$ Revision $', gợi ý sử dụng một makefile, vv) mà không cần sao chép bất kỳ văn bản nguyên văn nào, vì vậy nó hoàn toàn hợp pháp như chính nó câu trả lời. –

2

Trong Rails, tôi sử dụng đoạn mã này trong môi trường của tôi.rb cho tôi một hằng số mà tôi có thể sử dụng trong suốt ứng dụng (như trong phần cuối của bố cục ứng dụng).

SVN_VERSION = IO.popen("svn info").readlines[4].strip.split[1] 
+0

Chà, thật dễ dàng. Cảm ơn! – Jaryl

3

Dưới đây là một gợi ý, làm thế nào bạn có thể sử dụng khả năng Netbeans 'để
tạo nhiệm vụ tùy chỉnh kiến ​​ mà sẽ tạo ra scm-version.txt:

Mở build.xml bạn và thêm mã sau đây sau
<import file="nbproject/build-impl.xml"/>

<!-- STORE SUBVERSION BUILD STRING --> 
<target name="-pre-compile"> 
    <exec executable="svnversion" 
    output="${src.dir}/YOUR/PACKAGE/NAME/scm-version.txt"/> 
</target> 

Bây giờ, Netbeans strores chuỗi phiên bản Subversion để SCM-version.txt mọi lúc bạn làm sạch/xây dựng.

Bạn có thể đọc các tập tin trong thời gian chạy bằng cách thực hiện:

getClass().getResourceAsStream("scm-version.txt"); // ... 

Đừng quên để đánh dấu các tập tin SCM-version.txt như svn: ignore.

0

Tôi sử dụng dự án MSBuild Community Tasks có công cụ để truy lục số sửa đổi SVN và thêm nó vào AssemblyInfo.vb của bạn. Sau đó, bạn có thể sử dụng phản chiếu để truy xuất chuỗi này để hiển thị nó trong giao diện người dùng của mình.

Đây là full blog post with instructions.

0

Tôi đã tạo một SVN version plug-in cho dự án Build Version Increment trên CodePlex.Trình cắm thêm SVN này sẽ kéo số sửa đổi thay đổi mới nhất từ ​​bản sao làm việc của bạn và cho phép bạn sử dụng số đó trong số phiên bản của mình, điều này sẽ thực hiện chính xác những gì bạn đang cố gắng làm. Phiên bản Build Increment khá linh hoạt và sẽ cho phép bạn thiết lập cách phiên bản được thực hiện theo nhiều cách.

BVI chỉ hoạt động với Visual Studio, nhưng vì bạn đang sử dụng Asp.Net, điều đó sẽ không thành vấn đề. Nó không yêu cầu viết bất kỳ mã hoặc chỉnh sửa xml, do đó, yay!

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