รับหมายเลขการแก้ไขล่าสุดใน SVN หรือไม่


104

การใช้ PHP, Perl หรือ Python (โดยเฉพาะอย่างยิ่ง PHP) ฉันต้องการวิธีสืบค้นฐานข้อมูล SVN และค้นหาหมายเลขแก้ไขล่าสุดที่ส่งไปยัง SVN ฉันไม่ต้องการอะไรนอกจากนั้น ต้องไม่เร่งรัด (ดังนั้นฉันจึงทำทุกๆ 5 นาทีในฐานะงาน cron ประสิทธิภาพของ SVN ไม่ควรได้รับผลกระทบ)

SVN อยู่ในอินทราเน็ตของฉัน แต่ไม่ใช่คอมพิวเตอร์เฉพาะของฉัน

ฉันติดตั้ง SVN แล้ว แต่ไม่ได้ติดตั้งการผูกสำหรับ PHP / Perl / Python ฉันใช้ Windows XP แต่ฉันต้องการโซลูชันที่ไม่ขึ้นกับแพลตฟอร์มที่สามารถทำงานใน Linux ได้ หากคุณมีโซลูชัน Linux-only (หรือ XP-only) นั่นก็จะเป็นประโยชน์เช่นกัน


2
"svn info --show-item revision" จะให้การแก้ไขปัจจุบันซึ่งมีการอัพเดตไดเร็กทอรีปัจจุบัน
GreatAndPowerfulOz

2
$ svn info --show-item revision svn: invalid option: --show-itemการใช้ Apache Subversion 1.8.16 (r1740329) รวบรวมเมื่อ 26 เมษายน 2016 และพยายามด้วย CollabNet 1.6.11 (r934486) ที่รวบรวมเมื่อ 6 มีนาคม 2014
IceArdor

ในการเชื่อมต่อกับความคิดเห็นเหล่านี้โปรดดู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 เพื่อสร้างเครื่องมือ C # ของตัวเองที่ช่วยฉันในการสร้างแอตทริบิวต์ AssemblyFileVersion PS: ภาษาอังกฤษไม่ใช่ภาษาหลักของฉันและฉันรู้สึกงงงวยกับคำว่า 'ดังนั้น' ที่ฉันไม่เคยได้ยินมาก่อน Btw ต้นกำเนิดของมันค่อนข้างตลก: cf ( en.wiktionary.org/wiki/thusly ); คุณใช้มันโดยเจตนา (เล่นสำนวน?) หรือเป็นเรื่องปกติที่คุณจะใช้ในลักษณะนี้แทนที่จะใช้แบบนี้?
odalet

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

7
@Cobra_Fast คุณไม่จำเป็นต้องท่อที่คุณสามารถทำได้หรือsvn info --show-item revision $url svn info --show-item last-changed-revision $url
cp.engr

2
@ cp.engr ฉันเชื่อว่านั่นเป็นเพียงตั้งแต่ SVN v1.9 หรือมากกว่านั้น - นั่นคือฉันมีใน v1.9.5 และไม่มีอยู่ใน v1.8.6
icc97

131

หากคุณต้องการที่จะวิเคราะห์สำเนาการทำงานในท้องถิ่นซึ่งเป็นเครื่องมือที่ดีที่สุดคือที่มาพร้อมกับการโค่นล้มและผลิตออกเช่นsvnversion 968:1000Mเอกสารระบุว่า:

หมายเลขเวอร์ชันจะเป็นตัวเลขเดียวหากสำเนาที่ใช้งานได้เป็นการแก้ไขครั้งเดียวไม่ได้แก้ไขไม่ได้เปลี่ยนและมี URL ที่ตรงกับอาร์กิวเมนต์ TRAIL_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

ซึ่งจะให้หมายเลขการแก้ไขล่าสุดที่ส่วนหัวของที่เก็บของคุณ

มีบล็อกโพสต์ที่ดีเกี่ยวกับการรวมหมายเลขโค่นล้มลงในสคริปต์สร้างของคุณ:


นี่เป็นวิธีที่ง่ายที่สุดเนื่องจากคุณไม่ต้องค้นหา url ของที่เก็บก่อน ขอบคุณ!
derFunk

ฉันได้รับข้อผิดพลาดจากการใช้เครื่องหมายคำพูดรอบ HEAD ดังนั้นจึงควรเป็นsvn info -r HEAD
icc97

39

สิ่งนี้ควรใช้ได้ใน Bash จากไดเร็กทอรีการทำงาน ฉันเคยใช้มันใน Windows โดยติดตั้งUnixutils :

svn info |grep Revision: |cut -c11-

ใช้งานได้ถ้าคุณใส่ URL ที่เก็บโดยที่คุณมี% * ไม่ว่าคุณจะหมายถึงอะไรก็ตาม ไวยากรณ์ของการตัดที่ดีไม่ทราบมาก่อน
ypnos

1
หมายเหตุ: เนื่องจากไม่มี -rHEAD สิ่งนี้จะส่งคืนการแก้ไขคอมมิตสำหรับไฟล์หรือไดเร็กทอรีที่ร้องขอ นี่อาจไม่ใช่การแก้ไขโดยรวมล่าสุด (เนื่องจากการเปลี่ยนแปลงอื่น ๆ อาจเกิดขึ้นที่อื่นหรือในแผนผังย่อย)
Mr Fooz

4
นอกจากนี้ยังใช้ไม่ได้กับ SVN เวอร์ชันแปล (ในภาษาโปแลนด์จะเป็น | ตัด -c9-)
zgoda

2
นั่นคือ btw เหตุผลที่ฉันไม่ชอบเครื่องมือสำหรับนักพัฒนาบรรทัดคำสั่งที่แปลเป็นภาษาท้องถิ่น ความได้เปรียบเป็นศูนย์ปัญหามากมาย ฉันมักจะลบการแปลด้วยเหตุผลนี้
gimpf

8
การส่งผ่านตัวคั่นแทนการนับอักขระจะดีที่สุดสำหรับเนื้อหาที่แปลเป็นภาษาท้องถิ่นตัวอย่างเช่นsvn info | grep Revision | cut -d " " -f 2จะส่งคืนสตริงที่สองหลังจากแยกโดยใช้ช่องว่าง
Butifarra

34

สิ่งต่อไปนี้ควรใช้งานได้:

svnlook youngest <repo-path>

ส่งคืนหมายเลขการแก้ไขเดียว


15

หากต้องการรับหมายเลขการแก้ไขล่าสุด ("การแก้ไขส่วนหัว") บนการตอบรับระยะไกลของคุณให้ใช้สิ่งนี้:

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

ผลลัพธ์เช่น:

35669

12

หมายเหตุเกี่ยวกับการรับหมายเลขการแก้ไขล่าสุด:

สมมติว่าฉันได้cd-ed ในไดเรกทอรีย่อยที่แก้ไขแล้ว ( MyProjectDir) จากนั้นถ้าฉันโทร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 คุณสามารถใช้ option --show-itemเพื่อรับค่าหนึ่งในฟิลด์ของsvn infoเอาต์พุตของคำสั่ง คำสั่งนี้จะแสดงหมายเลขการแก้ไขเท่านั้น:

    svn info --show-item=revision <URL-to-repository>
    
  • รับเอาต์พุต XMLed ของข้อมูล 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-SvnRepositoryข้อมูลอ้างอิง PowerShell cmdletสำหรับข้อมูลเพิ่มเติม


7

ฉันคิดว่าคุณกำลังมองหา

svn info -r HEAD

คุณสามารถเชลล์ตามคำสั่งนั้นได้หรือไม่?

คุณอาจต้องระบุข้อมูลรับรองการเข้าสู่ระบบกับที่เก็บด้วย


ฉันคิดว่ามันต้องเป็นข้อมูล svn -r HEAD
Stephen

-r สามารถเลือกได้อย่างง่ายดายแล้ว
ypnos

ถูกต้อง - ฉันไม่ได้ระบุตัวเลือกสำหรับ -r - นี่เป็นเพียงเพื่อให้เขาค้นหาสิ่งที่ต้องการและเริ่มต้นด้วยความช่วยเหลือ / หนังสือ
ทิม

4

มีคนอื่นเอาชนะฉันให้โพสต์คำตอบsvnversionซึ่งเป็นทางออกที่ดีที่สุดอย่างแน่นอนหากคุณมีสำเนาที่ใช้งานได้ (IIRC ใช้ไม่ได้กับ URL) ฉันจะเพิ่มสิ่งนี้: หากคุณอยู่บนเซิร์ฟเวอร์ที่โฮสต์ SVN วิธีที่ดีที่สุดคือใช้svnlookคำสั่ง นี่คือคำสั่งที่คุณใช้เมื่อเขียนสคริปต์ hook เพื่อตรวจสอบที่เก็บ (และแม้แต่ธุรกรรมปัจจุบันในกรณีของ hooks ก่อนการคอมมิต) คุณสามารถพิมพ์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" โดยวนซ้ำผ่านแต่ละบรรทัดของเอาต์พุตที่สร้างขึ้น ใช้เครื่องหมายจุดคู่เป็นตัวคั่นระหว่างโทเค็นตัวแรกและตัวที่สองในบรรทัด เมื่อโทเค็นแรกคือ "การแก้ไข" จะตั้งค่าตัวแปรสภาพแวดล้อม REV เป็นโทเค็นที่สอง


1
คุณสามารถใช้ FINDSTR ได้เช่นกัน:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

ดูคำตอบ SOอื่น ๆสำหรับพื้นฐานนี้
icc97

2

คุณกำลังมองหาการโทรที่คล้ายกับการโทรแบบ commandline

svn info URL

ดูเหมือนว่าจะทำได้โดยใช้ไลบรารี pysvn และมีสูตรอาหารที่จะช่วยคุณเริ่มต้นได้ ฉันไม่แน่ใจว่ามีอะไรที่คล้ายกันสำหรับ PHP

หากคุณต้องการหันไปใช้การเรียกไบนารี SVN ด้วยตัวคุณเองอย่าลืมใช้ไฟล์ --xmlพารามิเตอร์เพื่อให้ได้ผลลัพธ์เป็น XML ซึ่งควรจะแยกวิเคราะห์ได้ง่ายกว่าเอาต์พุตบรรทัดคำสั่ง


ฉันใช้subprocess.check_outputใน python เพื่อหลีกเลี่ยงการเรียกไลบรารีอื่น หากคุณกำลังตรวจสอบหมายเลขการแก้ไข / ดึงสำเนาล่าสุดออกมามันง่ายกว่าเพียงแค่ใช้ svn จากบรรทัดคำสั่งผ่านsubprocess. ตอนนี้หากคุณทำการเช็คอินอัตโนมัติและรวมเข้าด้วยกัน ...
Droogans

2

คุณสามารถใช้รูปแบบ XML out ตัวอย่างเช่น:

  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


1

เพียงแค่svn infoใน 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] 

ผลลัพธ์คือจำนวนของการแก้ไขล่าสุด (joungest) สำหรับ 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

โซลูชันที่โพสต์ไม่ได้จัดการกรณีนี้เมื่อมีการใช้ภายนอก

หากฉันมี URL หรือสำเนาที่ใช้งานได้กับไฟล์ svn:externalsชุดคุณสมบัติภายนอกอาจมีการเปลี่ยนแปลงดังนั้นการแก้ไขล่าสุดของเซิร์ฟเวอร์การโค่นล้มจะเปลี่ยนไป แต่การแก้ไขล่าสุดของสำเนาหรือ URL ที่ใช้งานได้จะรายงานเฉพาะหมายเลขการแก้ไขเมื่อมีการเปลี่ยนแปลง svn: externals propty หรือรายการใด ๆ ที่ต่ำกว่าในเส้นทาง URL ซึ่งเป็นลักษณะการทำงานที่คาดไว้

ดังนั้นคุณจะได้รับไฟล์ svn:externalsคุณสมบัติและวนซ้ำ URL และเลือกการแก้ไขความสูงหรือค้นหา URL พื้นฐานจากเซิร์ฟเวอร์การโค่นล้ม เวอร์ชันที่รายงานจาก URL พื้นฐานจะมีการแก้ไขล่าสุดสำหรับ EVERYTHING บนเซิร์ฟเวอร์

ดังนั้นหากคุณใช้ภายนอกควรใช้svn info BASE_URLตำแหน่งที่BASE_URLเป็น URL รูทสำหรับเส้นทางทั้งหมดบนเซิร์ฟเวอร์การโค่นล้ม


0

สิ่งนี้จะได้รับเพียงหมายเลขการแก้ไขของการแก้ไขที่เปลี่ยนแปลงล่าสุด:

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

ฉันหวังว่านี่จะช่วยได้.



0

svn infoหรือsvnversionจะไม่คำนึงถึงไดเรกทอรีย่อยเพื่อค้นหา 'การแก้ไข' ล่าสุดของ codebase ที่ใช้งานจริงซึ่งวิธีการแฮ็กด้านล่างนี้ใช้ได้กับฉันอาจใช้เวลาสักครู่ในการเรียกใช้:

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

ดูเหมือนว่ามีรายการในคำถามที่พบบ่อยอย่างเป็นทางการสำหรับการนี้ ซอร์สโค้ดอยู่ใน C แต่ใช้หลักการเดียวกันดังที่ระบุไว้ที่นี่ในโพสต์รายชื่ออีเมลนี้


นี่เป็นเครื่องมือ / คำตอบที่ยอดเยี่ยม แต่ฉันไม่คิดว่าเขาต้องการมากขนาดนั้น - ฉันเข้าใจว่าจำเป็นต้องมีการแก้ไขล่าสุดเท่านั้นดังนั้นเขาอาจจะเริ่มบิลด์ได้หากการแก้ไขปัจจุบันของเขาแตกต่างจากก่อนหน้านี้ตั้งแต่เขาตรวจสอบครั้งล่าสุด บางทีฉันอาจเข้าใจผิด
ทิม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.