SVN에서 마지막 개정 번호를 받고 있습니까?


103

PHP, Perl 또는 Python (가급적 PHP)을 사용하여 SVN 데이터베이스를 쿼리하고 SVN으로 전송 된 마지막 개정 번호를 찾을 수있는 방법이 필요합니다. 그 외에는 필요 없습니다. 집약적이지 않아야합니다 (그래서 저는 크론 작업으로 5 분마다 수행합니다. SVN의 성능에는 영향을주지 않아야합니다).

SVN은 내 인트라넷에 있지만 특정 컴퓨터에는 없습니다.

SVN이 설치되어 있지만 PHP / Perl / Python 용 바인딩이 설치되어 있지 않습니다. 저는 Windows XP를 실행하고 있지만 Linux에서도 작동 할 수있는 플랫폼 독립적 인 솔루션을 선호합니다. Linux 전용 (또는 XP 전용) 솔루션이있는 경우에도 도움이됩니다.


2
"svn info --show-item 개정"은 현재 디렉토리가 업데이트 된 현재 개정을 제공합니다.
GreatAndPowerfulOz

1
$ svn info --show-item revision svn: invalid option: --show-item2016 년 4 월 26 일 컴파일 된 Apache Subversion 1.8.16 (r1740329) 사용. 2014 년 3 월 6 일 컴파일 된 CollabNet 1.6.11 (r934486)도 시도했습니다.
IceArdor 2017

이러한 의견과 관련 svn help info하여 법적 옵션을 확인하십시오svn info
XavierStuvw

@IceArdor 저는 SVN v1.9.5를 사용하고 --show-item있으며 사용 가능합니다
icc97

답변:


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

다음과 같이 XML로 출력을 얻을 수 있습니다.

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

오류가 있으면 출력이 stderr로 지정됩니다. 출력에서 stderr를 캡처하려면 다음을 사용하십시오.

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

2
오류가 있으면 출력이 stderr로 지정됩니다. 출력에서 stderr를 캡처하려면 다음과 같이 사용하십시오. $ output = svn info $url 2>&1;
Daniel X Moore

3
감사! --xml을 사용하여 AssemblyFileVersion 특성을 생성하는 데 도움이되는 자체 C # 도구를 빌드했습니다. 추신 : 영어는 제 모국어가 아니고 전에 들어 본 적이없는 '그러므로'라는 단어에 당황했습니다. Btw, 그 기원은 다소 웃기다 : cf ( en.wiktionary.org/wiki/thusly ); 의도적으로 사용 했습니까 (말장난?) 아니면 그렇게 대신 사용하는 것이 일반적입니까?
odalet 2013

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

7
@Cobra_Fast, 당신이 파이프 할 필요가 없습니다, 당신은 할 수있다 svn info --show-item revision $urlsvn info --show-item last-changed-revision $url.
cp.engr

2
@ cp.engr 나는 그것이 SVN v1.9 정도 이후라고 믿습니다-그것은 v1.9.5에 있고 v1.8.6에는 존재하지 않습니다
icc97

131

로컬 작업 복사본을 분석하려는 경우 가장 좋은 도구는 svnversionSubversion과 함께 제공되며 968:1000M. 문서는 다음과 같이 말합니다.

작업 복사본이 수정되지 않고 변경되지 않고 TRAIL_URL 인수와 일치하는 URL이있는 단일 개정 인 경우 버전 번호는 단일 번호입니다. 작업 복사본이 비정상적인 경우 버전 번호가 더 복잡해집니다.

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

2
동의, svn 정보보다 훨씬 낫다
Richard

32
svnversion은 로컬 작업 복사본 용이며 질문에 지정된대로 인트라넷의 저장소에 액세스하지 않습니다.
Daniel X Moore

5
svnversion에 익숙하지 않은 사용자를 위해 표준 명령 줄 클라이언트의 일부이며 여기에 svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html 매뉴얼 페이지가 있습니다 .
Michael Sorens

45

svn info -r HEAD

그러면 저장소 헤드에 최신 개정 번호가 표시됩니다.

빌드 스크립트에 Subversion 번호를 통합하는 방법에 대한 멋진 블로그 게시물이 있습니다.


이것은 저장소 URL을 먼저 찾을 필요가 없기 때문에 가장 간단한 방법입니다. 감사!
derFunk 2013-10-15

나는 HEAD 주위에 따옴표를 사용하여 오류가 발생했습니다. 그래서 그것은 단지svn info -r HEAD
icc97

38

이것은 작업 디렉토리의 Bash에서 작동합니다. 나는 unixutils가 설치된 Windows에서 사용했습니다 .

svn info |grep Revision: |cut -c11-

당신이 의미하는 바에 상관없이 % *가있는 곳에 저장소 URL을 넣으면 작동합니다. 컷의 좋은 구문은 전에는 몰랐습니다.
ypnos

1
참고 : 여기에는 -rHEAD가 없기 때문에 요청 된 파일 또는 디렉토리에 대한 커밋 개정을 반환합니다. 이것은 최신 전체 개정이 아닐 수 있습니다 (다른 변경 사항이 다른 곳이나 하위 트리에 커밋되었을 수 있기 때문).
Mr Fooz

4
또한 SVN의 현지화 된 버전에서는 작동하지 않습니다 (폴란드어에서는 | cut -c9-).
zgoda

2
즉, btw, 현지화 된 명령 줄 개발자 도구를 싫어하는 이유입니다. 제로 이점, 많은 문제. 나는 보통 정확히 이런 이유로 현지화를 제거합니다.
gimpf

7
문자 수 대신 구분 기호를 전달하면 지역화 된 콘텐츠에 가장 적합합니다. 예를 들어 svn info | grep Revision | cut -d " " -f 2공백을 사용하여 분할 된 후 두 번째 문자열이 반환됩니다.
Butifarra 2012-06-01

34

다음이 작동합니다.

svnlook youngest <repo-path>

단일 개정 번호를 반환합니다.


15

원격 저장소 에서 최신 개정 ( "헤드 개정") 번호를 얻으려면 다음을 사용하십시오.

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

예를 들어 출력 :

35669

12

최신 개정 번호 받기에 대한 참고 사항 :

cd수정 된 하위 디렉토리 ( MyProjectDir) 에서 -ed 했다고 가정 해보십시오 . 그런 다음 전화하면 svnversion:

$ svnversion .
323:340

... " 323:340" 이 표시됩니다. " " 여기에 수정 버전 323에서 340까지의 항목이 있습니다 .

 

그런 다음 전화하면 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)

... 나는 " 323"개정판을 얻습니다 -이것은 실제로 보고 한 것들 중 가장 낮은 개정판입니다 svnversion!

 

그런 다음 svn info재귀 모드에서 사용하여 로컬 디렉토리에서 더 많은 정보를 얻을 수 있습니다.

> 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
...

... ( grep자세한 내용을 보려면을 제거 하십시오).

 

마지막으로 온라인 저장소 의 최신 개정판 (이 경우 @ server.com) 을 확인하려면 어떻게해야 합니까? 그런 다음 다시 발행 svn info하지만 -r HEAD( -R이전 자본 옵션과 -r지금은 소문자 의 차이점에 유의하십시오 ) :

> 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)

흥미로운 점은- svn info여전히 현재 하위 디렉토리 ( MyProjectDir)를 참조하지만 온라인 경로는 MyProjectDir( .로컬 케이스와는 반대로 )로보고되고보고 된 온라인 개정은 가장 높고 ( 340-가장 낮은 버전 과 반대로 323보고 됨) 토지 상에서).


9
  • Subversion 1.9부터 --show-item 옵션을 사용 하여 svn info명령 출력 필드 중 하나의 값을 가져올 수 있습니다. 이 명령은 개정 번호 만 표시합니다.

    svn info --show-item=revision <URL-to-repository>
    
  • --xml옵션을 사용 하여 svn 정보의 XML 출력 을 가져오고 PowerShell을 사용하여 개정 번호를 가져옵니다. 다음은 간단한 예입니다.

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • VisualSVN Server 3.4 이상을 사용하면 다음 명령을 실행하여 리포지토리의 개정 수를 가져올 수 있습니다.

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    자세한 내용은 Get-SvnRepositoryPowerShell cmdlet 참조 를 참조하세요.


7

나는 당신이 찾고 있다고 생각합니다

svn info -r HEAD

그 명령에 쉘 수 있습니까?

저장소에도 로그인 자격 증명을 제공해야 할 것입니다.


나는 그것이 svn info -r HEAD가 될 필요가 있다고 생각한다
Stephen

-r은 쉽게 생략 할 수 있습니다.
ypnos

맞습니다--r에 대한 옵션을 지정하지 않았습니다. 이것은 그가 필요한 것을 찾고 도움말 / 책을 시작하기위한 것이 었습니다.
Tim

4

다른 사람이에 대한 답변을 게시하기 위해 저를 이겼습니다 svnversion. 이는 작업 복사본이있는 경우 확실히 최상의 솔루션입니다 (IIRC, URL에서는 작동하지 않음). 추가하겠습니다. SVN을 호스팅하는 서버에있는 경우 가장 좋은 방법은 svnlook명령 을 사용하는 것 입니다. 이것은 저장소를 검사하기 위해 후크 스크립트를 작성할 때 사용하는 명령입니다 (사전 커밋 후크의 경우 현재 트랜잭션 포함). svnlook help자세한 내용을 입력 할 수 있습니다 . 아마도 svnlook youngest명령 을 사용하고 싶을 것입니다 . repo 디렉토리에 직접 액세스해야하므로 서버에서 사용해야합니다.


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

또는

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

또는

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

2

다음 명령 중 하나를 사용할 수 있습니다.

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

Windows 배치 파일에서이 작업을 수행해야하는 불행이있는 경우 찾고있는 주문은 다음과 같습니다.

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%

이것은 "svn info"를 실행하여 생성 된 출력의 각 줄을 반복합니다. 줄의 첫 번째 및 두 번째 토큰 사이의 구분 기호로 콜론을 사용합니다. 첫 번째 토큰이 "Revision"이면 환경 변수 REV를 두 번째 토큰으로 설정합니다.


1
FINDSTR도 사용할 수 있습니다.FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97 2014 년

이 다른 참조 SO의 대답 이의 기초에 대한
icc97

2

명령 줄 호출과 유사한 호출을 찾고 있습니다.

svn info URL

이것은 pysvn 라이브러리를 사용하여 가능하며 시작하는 데 도움이 되는 레시피 가 있습니다. PHP와 비슷한 것이 있는지 잘 모르겠습니다.

SVN 바이너리를 직접 호출해야하는 경우 --xml매개 변수를 사용 하여 결과를 XML로 가져와야합니다. 명령 줄 출력보다 구문 분석하기가 더 쉽습니다.


나는 subprocess.check_output또 다른 라이브러리 호출을 피하기 위해 파이썬에서 사용 합니다. 개정 번호를 확인하거나 최신 사본을 가져 오는 경우 .NET을 통해 명령 줄에서 svn을 사용하는 것이 더 간단 subprocess합니다. 지금, 당신은 ... 자동 체크인 및 병합을 수행하는 경우
Droogans

2

XML 출력 형식을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

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

예 : 개정 번호 사용

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

2

아래 명령을 시도 할 수 있습니다.

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

1

Just svn infoin BASH는 모든 세부 정보를 제공합니다.

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

당신은 이것에서 개정을 얻을 것입니다


1

이를 수행하는 가장 간단하고 깨끗한 방법 (실제로 svn 1.9, 2015 년 출시)은 다음을 사용하는 것입니다.

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

출력은 SVNURL 에 대한 마지막 개정 (중간) 번호 또는 SVNPATH 작업 복사본의 현재 개정 번호입니다 . 는 --no-newline선택 사항입니다 지시 svn(화장품 줄 바꿈을 방출하지 않는 \n당신이 최소한의 출력 (만 개정 번호)를 필요로하는 경우, 값 후).

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


1
나는 svn 1.9.3을 시도했고, 여기에있는 명령은 svn info --show-item대신에--show item
elopio

0

게시 된 솔루션은 외부가 사용되는 경우를 처리하지 않습니다.

svn:externals속성이 설정된 URL 또는 작업 복사본이있는 경우 외부가 변경 될 수 있으므로 Subversion 서버의 최신 버전이 변경됩니다. 그러나 작업 사본 또는 URL의 최신 개정판은 svn : externals 속성이 변경되었거나 URL 경로의 하위 항목이 변경되었을 때만 개정 번호를보고합니다. 이는 예상되는 동작입니다.

따라서 svn:externals속성을 가져와 URL을 반복하고 높이 개정을 선택하거나 Subversion 서버에서 기본 URL을 쿼리합니다. 기본 URL에서보고 된 버전에는 서버의 EVERYTHING에 대한 최신 개정이 포함됩니다.

따라서 외부를 사용 svn info BASE_URL하는 BASE_URL경우 Subversion 서버의 모든 경로에 대한 루트 URL 을 사용 하는 것이 가장 좋습니다 .


0

마지막으로 변경된 개정판의 개정 번호 만 얻습니다.

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

이게 도움이 되길 바란다.


0

$ svn log | head -10.svn폴더 가있는 모든 디렉토리


0

svn info또는 svnversion하위 디렉토리를 고려하지 않고 라이브 코드베이스의 최신 '개정판'을 찾으려면 아래 해킹 된 방식이 저에게 효과적이었습니다. 실행하는 데 시간이 걸릴 수 있습니다.

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

0

"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에는 파일의 최신 개정 번호가 포함되어야합니다.


-1

이것 에 대한 공식 FAQ에 항목이있는 것 같습니다 . 소스 코드는 C로되어 있지만 이 메일 링리스트 게시물에 설명 된대로 동일한 원칙이 적용됩니다 .


이것은 훌륭한 도구 / 답변이지만 그가 그다지 필요하지 않다고 생각합니다. 나는 그가 마지막으로 확인한 이후 그의 현재 개정이 이전 개정과 다른 경우 빌드를 시작할 수 있도록 최신 개정 만 필요하다는 것을 이해했습니다. 오해했을 수도 있습니다.
Tim

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.