2010-01-02 31 views
44

Có lệnh Subversion để hiển thị số sửa đổi hiện tại không?Lệnh sửa đổi Subversion hiện tại

Sau svn checkout Tôi muốn bắt đầu một tập lệnh và cần số sửa đổi trong một biến. Nó sẽ là tuyệt vời nếu có một lệnh như svn info get_revision_number.

+8

Với svn mới nhất, 'info svn --show mục revision' sẽ hiển thị chỉ số phiên bản của các nguồn tin trong thư mục hiện hành. – GreatAndPowerfulOz

+1

Để lấy số bản sửa đổi của bản sao làm việc tại địa phương, hãy sử dụng 'svn info --show-item last-changed-revision' – domih

Trả lời

72

Bạn có thể sử dụng os.system() để thực thi một dòng lệnh như thế này:

svn info | grep "Revision" | awk '{print $2}' 

tôi làm điều đó trong đêm xây dựng các kịch bản của tôi.

Cũng trên một số nền tảng có lệnh svnversion, nhưng tôi nghĩ rằng tôi có lý do không sử dụng nó. Ahh, phải rồi. Bạn không thể nhận được số sửa đổi từ một kho lưu trữ từ xa để so sánh nó với một địa phương sử dụng svnversion.

+1

Lưu ý rằng có một thẻ 'cmd.exe' trong câu hỏi ban đầu, ngụ ý OP là trong Windows, nơi bạn không thể sử dụng' grep' và 'awk'. – iamamac

+1

os.system chỉ cho bạn biết mã thoát, nó không cung cấp cách để có được đầu ra. Thay vào đó, thực hiện 'svn info' (như với mô đun subprocess), đọc đầu ra và thực hiện các bước grep/awk trực tiếp trong Python (' if "Revision" trong dòng: return line.split() [1] ') là thường đơn giản hơn và dễ hơn là viết các lệnh bash bằng Python. –

+0

Iamamac: có các cổng độc lập và độc lập (cộng với SfU và bất kỳ msft nào gọi nó ngay bây giờ), nhưng quan điểm của bạn là nó không có sẵn như thường lệ. –

2

svn info, tôi tin rằng, là những gì bạn muốn.

Nếu bạn chỉ muốn sửa đổi, có lẽ bạn có thể làm một cái gì đó như:

svn info | grep "Revision:" 
22

Ngoài ra còn có một thuận tiện hơn (đối với một số) svnversion lệnh.

Output có thể là một số duy nhất sửa đổi hoặc một cái gì đó như thế này (từ -h):

4123:4168  mixed revision working copy 
    4168M   modified working copy 
    4123S   switched working copy 
    4123:4168MS mixed revision, modified, switched working copy 

tôi sử dụng đoạn mã python này để trích xuất thông tin phiên bản:

import re 
import subprocess 

p = subprocess.Popen(["svnversion"], stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE) 
p.wait() 
m = re.match(r'(|\d+M?S?):?(\d+)(M?)S?', p.stdout.read()) 
rev = int(m.group(2)) 
if m.group(3) == 'M': 
    rev += 1 
4
  1. Đầu tiên của tất cả các trạng thái svn có số sửa đổi, bạn có thể đọc nó từ đó.

  2. Ngoài ra, mỗi tập tin mà bạn lưu trữ trong SVN có thể lưu trữ các số phiên bản của riêng mình - thêm từ khóa $Rev$ đến tập tin của bạn và chạy propset: svn propset svn:keywords "Revision" file

  3. Cuối cùng, số phiên bản cũng nằm trong .svn/entries tập tin , dòng thứ tư

Bây giờ mỗi lần bạn kiểm tra tệp đó, nó sẽ tự sửa đổi.

+0

Đối với mục 3, có hợp lý để mong đợi số sửa đổi sẽ luôn nằm trên hàng thứ 4 không? Nếu đó là một kỳ vọng hợp lý, điều này có vẻ giống như cách dễ nhất để làm điều đó trên nhiều môi trường. – grimus

+0

Có, ít nhất là trong phạm vi phiên bản lật đổ hợp lý. Nếu họ thay đổi định dạng trong một số phiên bản tương lai (có thể nhưng không có khả năng sớm) thì bạn sẽ phải thích nghi. –

+0

Tôi đã xem xét điều này một chút và thấy điều này: http://svnbook.red-bean.com/en/1.4/svn.developer.insidewc.html Có vẻ như định dạng này có khả năng thay đổi theo thời gian . Tôi chắc chắn cho hầu hết mọi thứ, đọc các tập tin mục sẽ làm việc tốt, nhưng bạn sẽ phải chắc chắn để duy trì mã của bạn nếu các tập tin mục thay đổi. – grimus

0

Tôi nghĩ rằng tôi phải làm svn thông tin và sau đó lấy số với một thao tác chuỗi từ "Xem xét lại: xxxxxx" Nó sẽ chỉ tốt đẹp, nếu có một lệnh trả về chỉ số :)

2

sử dụng một cái gì đó như sau, lợi dụng đầu ra XML của lật đổ:

# parse rev from popen "svn info --xml" 
dom = xml.dom.minidom.parse(os.popen('svn info --xml')) 
entry = dom.getElementsByTagName('entry')[0] 
revision = entry.getAttribute('revision') 

cũng lưu ý rằng, tùy thuộc vào những gì bạn cần điều này cho, mục <commit revision=...> có thể hơn những gì bạn đang tìm kiếm. Điều đó cho phép "Last Changed Rev", mà sẽ không thay đổi cho đến khi mã trong cây hiện tại thực sự thay đổi, trái ngược với "Revision" (những gì ở trên) sẽ thay đổi bất cứ lúc nào bất cứ điều gì trong kho thay đổi (thậm chí chi nhánh) và bạn làm một "svn up", không giống nhau, cũng không hữu ích.

+0

Yêu cầu svn xuất XML và sau đó phân tích nó? Nó có nghĩa là một trò đùa? –

+1

@JulienGuertault, không, đầu ra XML là * có nghĩa là * để sử dụng có lập trình trong khi không phải là XML. Phân tích cú pháp đầu ra của con người đang mạo hiểm định dạng thay đổi trong tương lai và phá vỡ mã của bạn, và tùy thuộc vào ngữ cảnh có thể yêu cầu công việc tùy chỉnh mỗi khi bạn cần làm những việc tương tự. Nếu bạn sử dụng phương pháp XML, bạn có thể tiết kiệm công sức cho cơ sở hạ tầng, theo thời gian. Không đùa, nhưng tôi cũng sẽ không nói làm theo cách khác là bằng mọi cách * sai *. Chỉ là sở thích cá nhân.Tôi đã làm cả hai, trong các nội dung khác nhau. –

+0

Máy so với phân tích cú pháp đầu ra của con người là một điểm hợp lệ (đáng chú ý trong câu trả lời của bạn). Nhưng tại sao không đơn giản sử dụng 'svnversion'? Nó có một đầu ra nhỏ gọn được ghi lại và không yêu cầu thứ gì đó phức tạp này để phân tích nó. –

1

Không ai đề cập đến cho Windows thế giới SubWCRev, trong đó, sử dụng đúng cách, có thể thay thế dữ liệu cần thiết vào những nơi cần thiết automagically, nếu SubWCRev kịch bản cuộc gọi dưới dạng SubWCRev WC_PATH TPL-FILE READY-FILE

Mẫu của tôi sau cam kết nối (một phần của)

SubWCRev.exe CustomLocations Builder.tpl z:\Builder.bat 
... 
call z:\Builder.bat 

nơi Builder.tpl của tôi là

svn.exe export trunk z:\trunk$WCDATE=%Y%m%d$-r$WCREV$ 

như kết quả, tôi có mỗi khi bat-file với phần biến - nam đ dir - tương ứng với siêu dữ liệu của công tác Sao chép

2

Chỉ cần sử dụng @ câu trả lời badcat trong một phiên bản sửa đổi, sử dụng subprocess.check_output():

import subprocess 
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip() 

Tôi tin rằng bạn cũng có thể, cài đặt và sử dụng pysvn nếu bạn muốn sử dụng python để giao tiếp với svn.

3

REV = svn info svn://svn.code.sf.net/p/retroshare/code/trunk | grep 'Revision:' | cut -d\ -f2

+0

Lưu ý rằng RetroShare có thể có một số vấn đề về bảo mật http://specialmeaning.blogspot.com/2016/09/retroshare-scandal-of-free-communication.html – Sergei

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