Nhận số sửa đổi cuối cùng trong SVN?


103

Sử dụng PHP, Perl hoặc Python (tốt nhất là PHP), tôi cần một cách để truy vấn cơ sở dữ liệu SVN và tìm ra số sửa đổi cuối cùng được gửi đến SVN. Tôi không cần gì khác hơn thế. Nó cần phải không chuyên sâu (vì vậy tôi thực hiện 5 phút một lần như một công việc cron; hiệu suất của SVN sẽ không bị ảnh hưởng).

SVN nằm trên Mạng nội bộ của tôi, nhưng không phải máy tính cụ thể của tôi.

Tôi đã cài đặt SVN, nhưng không có ràng buộc nào được cài đặt cho PHP / Perl / Python. Tôi đang chạy Windows XP, nhưng tôi thích một giải pháp độc lập với nền tảng cũng có thể hoạt động trong Linux. Nếu bạn có giải pháp chỉ dành cho Linux (hoặc chỉ dành cho XP), giải pháp đó cũng sẽ hữu ích.


2
"svn info --show-item rev" sẽ cung cấp bản sửa đổi hiện tại mà thư mục hiện tại được cập nhật.
GreatAndPowerfulOz

1
$ svn info --show-item revision svn: invalid option: --show-itemSử dụng Apache Subversion 1.8.16 (r1740329) được biên dịch vào ngày 26 tháng 4 năm 2016. Cũng đã thử với CollabNet 1.6.11 (r934486) được biên dịch vào ngày 6 tháng 3 năm 2014.
IceArdor

Liên quan đến các ý kiến, kiểm tra svn help infođối với các tùy chọn pháp lý chosvn info
XavierStuvw

@IceArdor Tôi đang sử dụng SVN v1.9.5 và --show-itemcó sẵn
icc97

Câu trả lời:


68
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

Bạn có thể lấy đầu ra bằng XML như sau:

$output = `svn info $url --xml`;

Nếu có lỗi thì đầu ra sẽ được chuyển trực tiếp đến stderr. Do đó, để nắm bắt stderr trong đầu ra của bạn, hãy sử dụng:

$output = `svn info $url 2>&1`;

2
Nếu có lỗi thì đầu ra sẽ được chuyển trực tiếp đến stderr. Do đó, để nắm bắt stderr trong đầu ra của bạn, hãy sử dụng: $ output = svn info $url 2>&1;
Daniel X Moore

3
Cảm ơn! Tôi đã sử dụng --xml để xây dựng công cụ C # của riêng mình giúp tôi tạo thuộc tính AssemblyFileVersion. Tái bút: Tiếng Anh không phải là ngôn ngữ chính của tôi và tôi cảm thấy bối rối với từ 'do đó' mà tôi chưa từng nghe trước đây. Btw, nguồn gốc của nó khá buồn cười: cf ( en.wiktionary.org/wiki/thusly ); bạn đã sử dụng nó một cách cố ý (chơi chữ?) hay bạn thường sử dụng như vậy thay vì như vậy?
odalet

7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast

7
@Cobra_Fast, bạn không cần phải nhập, bạn có thể làm svn info --show-item revision $urlhoặc svn info --show-item last-changed-revision $url.
cp.engr

2
@ cp.engr Tôi tin rằng đó chỉ là kể từ khi SVN v1.9 trở lên - tức là tôi có nó trong v1.9.5 và nó không tồn tại trong v1.8.6
icc97,

131

Nếu bạn muốn phân tích một bản sao làm việc cục bộ, công cụ tốt nhất là svnversionđi kèm với Subversion và tạo ra kết quả như thế nào 968:1000M. Tài liệu cho biết:

Số phiên bản sẽ là một số duy nhất nếu bản sao hoạt động là một bản sửa đổi, chưa được sửa đổi, chưa được chuyển đổi và có URL khớp với đối số TRAIL_URL. Nếu bản sao làm việc khác thường thì số phiên bản sẽ phức tạp hơn:

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

2
đã đồng ý, tốt hơn nhiều so với thông tin svn
Richard

32
svnversion dành cho các bản sao làm việc cục bộ và sẽ không truy cập vào kho lưu trữ trên mạng nội bộ như được chỉ định trong câu hỏi.
Daniel X Moore

5
Đối với những người không quen thuộc với svnversion, nó là một phần của máy khách dòng lệnh tiêu chuẩn và đây là trang hướng dẫn sử dụng: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens

45

svn info -r HEAD

Điều này sẽ cung cấp cho bạn số bản sửa đổi mới nhất ở đầu kho lưu trữ của bạn.

Có một số bài đăng trên blog hay về việc tích hợp số subversion vào tập lệnh xây dựng của bạn:


Đây là cách đơn giản nhất vì bạn không phải tìm url kho lưu trữ trước. Cảm ơn!
derFunk

Tôi đã nhận lỗi sử dụng dấu ngoặc kép quanh HEAD, vì thế chỉ nênsvn info -r HEAD
icc97

38

Điều này sẽ hoạt động trong Bash, từ một thư mục đang hoạt động. Tôi đã sử dụng nó trong Windows có cài đặt unixutils :

svn info |grep Revision: |cut -c11-

Nó hoạt động nếu bạn đặt URL kho lưu trữ ở nơi bạn có% *, bất kể ý bạn là gì. Cú pháp cắt đẹp, không biết trước đây.
ypnos

1
Lưu ý: vì điều này thiếu -rHEAD, điều này sẽ trả về bản sửa đổi cam kết cho tệp hoặc thư mục được yêu cầu. Đây có thể không phải là bản sửa đổi tổng thể mới nhất (vì những thay đổi khác có thể đã được thực hiện ở nơi khác hoặc trong một cây con).
Mr Fooz 23/02/09

4
Ngoài ra, điều này không hoạt động đối với các phiên bản bản địa hóa của SVN (trong tiếng Ba Lan, đây sẽ là | cut -c9-).
zgoda 23/02/09

2
đó là, btw, lý do tại sao tôi thực sự không thích các công cụ dành cho nhà phát triển dòng lệnh được bản địa hóa; lợi thế bằng không, nhiều vấn đề. Tôi thường xóa các bản địa hóa vì lý do chính xác này.
gimpf

7
Việc chuyển một dấu phân tách thay vì một số ký tự phù hợp nhất với nội dung được bản địa hóa, ví dụ: svn info | grep Revision | cut -d " " -f 2sẽ trả về chuỗi thứ hai sau khi nó được phân tách bằng dấu cách.
Butifarra

34

Những điều sau sẽ hoạt động:

svnlook youngest <repo-path>

Nó trả về một số sửa đổi duy nhất.


15

Để thực sự nhận được số bản sửa đổi mới nhất ("bản sửa đổi đầu") trên kho lưu trữ từ xa của bạn , hãy sử dụng cái này:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

Kết quả đầu ra ví dụ:

35669

12

Lưu ý về việc nhận số sửa đổi mới nhất:

Giả sử tôi đã cd-ed trong một thư mục con được xem lại ( MyProjectDir). Sau đó, nếu tôi gọi svnversion:

$ svnversion .
323:340

... Tôi nhận được " 323:340", mà tôi đoán có nghĩa là: " bạn có các mục ở đây, từ bản sửa đổi 323 đến 340 ".

 

Sau đó, nếu tôi gọi svn info:

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

... Tôi nhận " 323" là bản sửa đổi - đó thực sự là bản sửa đổi thấp nhất trong số những bản được báo cáo svnversion!

 

Sau đó, chúng ta có thể sử dụng svn infotrong chế độ đệ quy để lấy thêm thông tin từ thư mục cục bộ:

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

... (xóa grepđể xem thêm chi tiết).

 

Cuối cùng, phải làm gì khi chúng ta muốn kiểm tra bản sửa đổi mới nhất của kho lưu trữ trực tuyến (trong trường hợp này là @ server.com)? Sau đó, chúng tôi lại phát hành svn info, nhưng với -r HEAD(lưu ý sự khác biệt giữa -Rquyền chọn vốn trước đây và chữ thường -rbây giờ):

> svn info -r 'HEAD'
USER@server.com's password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

Điều thú vị là - svn infovẫn đề cập đến thư mục con hiện tại ( MyProjectDir), tuy nhiên, đường dẫn trực tuyến được báo cáo là MyProjectDir(trái ngược với .trường hợp cục bộ) - và bản sửa đổi trực tuyến được báo cáo là cao nhất ( 340- trái ngược với đường dẫn thấp nhất, 323được báo cáo tại địa phương).


9
  • Bắt đầu với Subversion 1.9, bạn có thể sử dụng option --show-item để nhận giá trị của một trong các trường svn infođầu ra của lệnh. Lệnh này sẽ chỉ hiển thị số sửa đổi:

    svn info --show-item=revision <URL-to-repository>
    
  • Nhận đầu ra XMLed của thông tin svn bằng cách sử dụng --xmltùy chọn và sử dụng PowerShell để nhận số sửa đổi. Đây là một ví dụ đơn giản:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Sử dụng VisualSVN Server 3.4 hoặc mới hơn, bạn có thể nhận được số lượng bản sửa đổi trong kho lưu trữ bằng cách chạy các lệnh sau:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Xem phần Get-SvnRepositorytham khảo lệnh ghép ngắn PowerShell để biết thêm thông tin.


7

Tôi nghĩ bạn đang tìm kiếm

svn info -r HEAD

Bạn có thể sử dụng lệnh đó không?

Có thể bạn cũng sẽ cần cung cấp thông tin đăng nhập với kho lưu trữ.


Tôi nghĩ rằng nó cần phải là thông tin svn -r HEAD
Stephen

-r có thể dễ dàng được vô hạn sau đó.
ypnos 23/02/09

Đúng - tôi không chỉ định tùy chọn cho -r - điều này chỉ để anh ấy tìm những gì anh ấy cần và bắt đầu với trợ giúp / cuốn sách.
Tim

4

Ai đó đã đánh bại tôi khi đăng câu trả lời về svnversion, đó chắc chắn là giải pháp tốt nhất nếu bạn có một bản sao đang hoạt động (IIRC, nó không hoạt động với URL). Tôi sẽ thêm điều này: nếu bạn đang sử dụng máy chủ lưu trữ SVN, cách tốt nhất là sử dụng svnlooklệnh. Đây là lệnh bạn sử dụng khi viết tập lệnh hook để kiểm tra kho lưu trữ (và thậm chí cả giao dịch hiện tại, trong trường hợp hook trước khi cam kết). Bạn có thể gõ svnlook helpđể biết chi tiết. Bạn có thể muốn sử dụng svnlook youngestlệnh. Lưu ý rằng nó yêu cầu quyền truy cập trực tiếp vào thư mục repo, vì vậy nó phải được sử dụng trên máy chủ.


2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

Hoặc là

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

Hoặc là

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335

2

Bạn có thể sử dụng một trong hai lệnh:

1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found


2

Nếu bạn không may phải thực hiện việc này từ tệp lô Windows, đây là câu thần chú bạn đang tìm kiếm:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

Điều này chạy "thông tin svn", lặp lại qua từng dòng đầu ra được tạo. Nó sử dụng dấu hai chấm làm dấu phân cách giữa mã thông báo đầu tiên và thứ hai trên dòng. Khi mã thông báo đầu tiên là "Bản sửa đổi", nó sẽ đặt biến môi trường REV thành mã thông báo thứ hai.


1
bạn cũng có thể sử dụng FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

xem câu trả lời SO khác này để biết cơ sở của điều này
icc97.

2

Bạn đang tìm kiếm một cuộc gọi tương tự như lệnh gọi dòng lệnh

svn info URL

Có vẻ như điều này là có thể sử dụng thư viện pysvn và có một công thức sẽ giúp bạn bắt đầu. Tôi không chắc liệu có thứ gì đó tương tự cho PHP hay không.

Nếu bạn cần tự gọi mã nhị phân SVN, hãy đảm bảo sử dụng --xmltham số để nhận kết quả dưới dạng XML. Điều đó sẽ dễ dàng hơn để phân tích cú pháp so với đầu ra dòng lệnh.


Tôi sử dụng subprocess.check_outputtrong python để tránh một cuộc gọi thư viện khác. Nếu bạn chỉ kiểm tra số sửa đổi / kéo xuống các bản sao mới nhất, thì đơn giản hơn chỉ cần sử dụng svn từ dòng lệnh qua subprocess. Bây giờ, nếu bạn đang làm check-in tự động và hòa trộn ...
Droogans

2

Bạn có thể sử dụng định dạng XML out, ví dụ:

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

Ví dụ: sử dụng số sửa đổi

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml

2

Bạn có thể thử lệnh dưới đây:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'

1

Chỉ svn infobằng BASH sẽ cung cấp cho bạn tất cả các chi tiết

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

Bạn sẽ nhận được TÁI TẠO từ điều này


1

Cách đơn giản và rõ ràng để làm điều đó (thực tế là svn 1.9, phát hành năm 2015) là sử dụng:

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

Đầu ra là số của bản sửa đổi cuối cùng (mới nhất) cho SVNURL, hoặc số của bản sửa đổi hiện tại của bản sao làm việc của SVNPATH. Đây --no-newlinelà tùy chọn, hướng dẫn svnkhông phát ra một dòng mới thẩm mỹ ( \n) sau giá trị, nếu bạn cần đầu ra tối thiểu (chỉ số sửa đổi).

Xem: https://subversion.apache.org/docs/release-notes/1.9.html#svn-info-item


1
Tôi cố gắng trên svn 1.9.3, và lệnh ở đây là svn info --show-item, thay vì--show item
elopio

0

Các giải pháp đã đăng không xử lý trường hợp khi các thiết bị bên ngoài đang được sử dụng.

Nếu tôi có một URL hoặc một bản sao hoạt động với thuộc svn:externalstính được đặt, các phần tử bên ngoài có thể thay đổi và do đó, bản sửa đổi mới nhất của máy chủ lật đổ sẽ thay đổi. Nhưng bản sửa đổi mới nhất của bản sao hoặc URL đang hoạt động sẽ chỉ báo cáo số bản sửa đổi khi svn: externals propty thay đổi hoặc bất kỳ mục nào thấp hơn trong đường dẫn URL, đó là hành vi được mong đợi.

Vì vậy, bạn có thể lấy thuộc svn:externalstính và lặp lại các URL và chọn bản sửa đổi độ cao hoặc truy vấn URL cơ sở từ máy chủ subversion. Phiên bản được báo cáo từ URL cơ sở sẽ chứa bản sửa đổi mới nhất cho MỌI THỨ trên máy chủ.

Vì vậy, nếu bạn đang sử dụng externals, nó là tốt nhất để sử dụng svn info BASE_URLở đâu BASE_URLlà URL gốc cho tất cả các đường dẫn trên máy chủ lật đổ.


0

Điều này sẽ chỉ nhận được số sửa đổi của bản sửa đổi được thay đổi cuối cùng:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

Tôi hi vọng cái này giúp được.


0

$ svn log | head -10 trên bất kỳ thư mục nào có .svnthư mục


0

svn infohoặc svnversionsẽ không xem xét các thư mục con, để tìm 'bản sửa đổi' mới nhất của cơ sở mã trực tiếp theo cách bị tấn công bên dưới đã làm việc với tôi - có thể mất một lúc để chạy:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$

0

Điều này có thể được lấy bằng thư viện "SVN" :

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

Head_revision phải chứa số sửa đổi mới nhất của tệp


-1

Có vẻ như có một mục trong Câu hỏi thường gặp chính thức cho việc này . Mã nguồn bằng C nhưng áp dụng nguyên tắc tương tự, như được nêu ở đây trong bài đăng danh sách gửi thư này .


Đây là một công cụ / câu trả lời tuyệt vời, nhưng tôi không nghĩ anh ấy cần nhiều như vậy - tôi hiểu rằng anh ấy chỉ cần bản sửa đổi mới nhất để có thể anh ấy có thể bắt đầu xây dựng nếu bản sửa đổi hiện tại của anh ấy khác với bản trước đó kể từ lần cuối anh ấy kiểm tra. Có lẽ tôi đã hiểu lầm.
Tim

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.