อะไรคือ pre-revprop-change hook ใน SVN และฉันจะสร้างมันได้อย่างไร


168

ฉันต้องการแก้ไขความคิดเห็นบันทึกในเบราว์เซอร์ที่เก็บและได้รับข้อความแสดงข้อผิดพลาดว่าไม่มีการขอ pre-revprop-change hook สำหรับที่เก็บ นอกจากชื่อที่น่ากลัวแล้วตะขอ pre-revprop-change คืออะไรและฉันจะสร้างมันได้อย่างไร


16
ตอนนี้การเชื่อมโยงนี้เป็นครั้งที่สองหลังจากที่เชื่อมโยงไปยังคำถามนี้ :)
Ulysses

ลิงค์เกี่ยวกับโอกาสในการขาย VERY ล้าสมัยมาก SVNBook 1.0 หนึ่งในปัจจุบันคือ 1.7 และ 1.8 (คืน): svnbook.red-bean.com/en/1.8
bahrep

คำตอบ:


52

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

มีเทมเพลตใน SVN distrib สำหรับ hooks ที่แตกต่างกันซึ่งอยู่ในไดเรกทอรีย่อย / hooks (* .tmpl ที่คุณต้องแก้ไขและเปลี่ยนชื่อทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการของคุณเพื่อเปิดใช้งาน)


2
คำแนะนำทั้งหมดอยู่ในสคริปต์แม่แบบของ hook หากคุณต้องการตะขอสำหรับsvnsyncมิเรอร์สคริปต์เริ่มต้นจะต้องเปลี่ยนเพราะอนุญาตการเปลี่ยนแปลง svn: log เท่านั้น Svnsync เปลี่ยนแปลงมากกว่านี้ดังนั้นฉันเพียงแค่ใส่เข้าไปที่exit 0นั่นเพื่ออนุญาตการเปลี่ยนแปลงคุณสมบัติทั้งหมด (เนื่องจากนี่เป็นภาพสะท้อนสำหรับฉันเท่านั้น)
Matt Connolly

... จากนั้นให้บันทึกเป็นpre-revprop-changeไดเรกทอรีเดียวกันและทำให้สามารถเรียกใช้งานได้สำหรับผู้ใช้เว็บเซิร์ฟเวอร์ (บน Linux)
Mateng

209

สำหรับ Windows นี่คือลิงค์ไปยังไฟล์แบตช์ตัวอย่างที่อนุญาตการเปลี่ยนแปลงข้อความบันทึกเท่านั้น (ไม่ใช่คุณสมบัติอื่น):

http://ayria.livejournal.com/33438.html

โดยทั่วไปคัดลอกรหัสด้านล่างลงในไฟล์ข้อความและตั้งชื่อpre-revprop-change.batและบันทึกไว้ใน\hooksไดเรกทอรีย่อยสำหรับที่เก็บของคุณ

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

37
อาจมีการเชื่อมโยงไปยังรุ่นมีstackoverflow.com/questions/6155/... ฉันเขียนที่เกี่ยวและโพสต์ไว้ในฟอรัม SVN เมื่อไม่นานมานี้ ฉันคิดว่าฉันควรจะใส่เครดิตลงในความคิดเห็นเบ็ด
Philibert Perusse

1
ฉันใช้สคริปต์นี้กับ VisualSVN 2.0.8 และ TortoiseSVN 1.6.11 และใช้งานได้ดี
Mark Biek

27
คุณสามารถแก้ไข hooks ใน VisualSVN ได้โดยคลิกขวาชื่อที่เก็บข้อมูลของคุณในเซิร์ฟเวอร์ VisualSVN และเลือก "Properties ... " คุณจะเห็นแท็บ "hooks" ที่นั่นคุณจะเห็นตะขอชนิดต่าง ๆ ที่มีอยู่ เลือกรหัสที่ถูกต้องคลิก "แก้ไข" และวางโค้ดด้านบนลงไป หวังว่าจะช่วยให้ผู้ใช้ VisualSVN!
Chuck Le Butt

ใช้งานได้สำหรับฉันปิดการใช้งานสาย: หาก / ฉันไม่ใช่ "% action%" == "M" goto วิธีอื่น ๆ มันยังคงบอกเพียงการปรับเปลี่ยนที่ได้รับอนุญาต
นาธาน

6
วิธีที่รวดเร็วและสกปรกสำหรับ windows คือการสร้างไฟล์ว่างที่เรียกว่า hooks \ pre-revprop-change.bat
Ben Claar

18

สำหรับ Linux เพื่ออนุญาตรุ่นของข้อคิดเห็นการบันทึก

  • ค้นหาไฟล์pre-revprop-change.tmplในhooksไดเรกทอรีของที่เก็บของคุณ
  • คัดลอกไฟล์ไปยังไดเรกทอรีเดียวกันเปลี่ยนชื่อเป็น pre-revprop-change
  • ให้สิทธิ์ดำเนินการกับไฟล์ (สำหรับผู้ใช้เซิร์ฟเวอร์เช่นwww-data)

แก้ไข: (ขอบคุณ lindes)

  • หลังจากนั้นคุณอาจต้องแก้ไขสคริปต์เพื่อส่งคืนค่าออก0สำหรับประเภทการแก้ไขที่คุณต้องการอนุญาต

นี่ไม่เพียงพอ ... ยังคงต้องเปลี่ยนค่าการออกอย่างเหมาะสม แต่ฉันพบว่ามันมีประโยชน์อยู่แล้วในฐานะที่เป็นตัวชี้ไปยังสถานที่ที่เหมาะสมในการมอง ... ซึ่งคำตอบอื่น ๆ ขาดหายไปหรือให้คำตอบเฉพาะกับหน้าต่าง ขอบคุณมากสำหรับสิ่งนี้
lindes

1
ฉันค่อนข้างมั่นใจว่าในรุ่น Ubuntu Linux ของฉันการคัดลอกและให้สิทธิ์ก็เพียงพอแล้ว แต่ฉันไม่รู้อีกแน่นอน ฉันได้แก้ไขคำตอบแล้ว ขอบคุณ
Alois Heimer

ฉันแน่ใจว่ามันใช้งานไม่ได้สำหรับฉันเหมือนตอนที่ฉันลองใช้งาน 2 วันที่ผ่านมาและเพิ่มความคิดเห็นนี้ อย่างไรก็ตามด้วยการแก้ไขคำตอบนี้เหมาะสำหรับฉัน
lindes

11

นี่คือลิงค์ไปยังคำถามสแต็คล้นที่มี hooks ทั่วไปหลาย ๆประเภท Common of Subversion Hooksรวมถึงต้นฉบับดั้งเดิมของpre-revprop-changehook สำหรับการโพสต์ไขว้ของ Windows ที่นี่

คุณควรอ้างอิงที่นั่นเนื่องจากอาจมีการปรับปรุงเมื่อเวลาผ่านไป


7

ขอบคุณ #patmortech

และฉันได้เพิ่มรหัสของคุณซึ่ง "ผู้ใช้เดียวกันเท่านั้นที่สามารถเปลี่ยนรหัสของเขา"

:: Only allow editing of the same user.
for /f "tokens=*" %%a in ( 
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do ( 
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER

4

ชื่อของสคริปต์เบ็ดคือไม่ได้น่ากลัวดังนั้นหากคุณจัดการถอดรหัสมัน: มันก่อนการแก้ไขเปลี่ยนแปลงคุณสมบัติเบ็ด ในระยะสั้นวัตถุประสงค์ของpre-revprop-change hook script คือเพื่อควบคุมการเปลี่ยนแปลงคุณสมบัติ unversioned (revision) และเพื่อส่งการแจ้งเตือน (เช่นส่งอีเมลเมื่อมีการเปลี่ยนแปลงคุณสมบัติการแก้ไข)

คุณสมบัติการโค่นล้มมี 2 ประเภท:

  • คุณสมบัติที่กำหนดเวอร์ชัน (เช่นsvn:needs-lockและsvn:mime-type ) ที่สามารถตั้งค่าในไฟล์และไดเรกทอรี
  • unversioned คุณสมบัติ (แก้ไข) (เช่นsvn:logและsvn:date) ที่ตั้งอยู่บนพื้นที่เก็บข้อมูลการแก้ไข

คุณสมบัติที่กำหนดเวอร์ชันมีประวัติและสามารถจัดการได้โดยผู้ใช้ทั่วไปที่มีสิทธิ์เข้าถึงแบบอ่าน / เขียนในที่เก็บ ในทางกลับกันคุณสมบัติที่ไม่มีการพลิกผันไม่มีประวัติใด ๆ และให้บริการเพื่อการบำรุงรักษาเป็นส่วนใหญ่ ตัวอย่างเช่นหากคุณยอมรับการแก้ไขจะได้รับทันทีsvn:dateด้วยเวลา UTC ของการส่งมอบsvn:authorพร้อมชื่อผู้ใช้และsvn:logข้อความบันทึกการกระทำ (หากคุณระบุไว้)

ตามที่ฉันได้ระบุไว้วัตถุประสงค์ของpre-revprop-changehook script คือเพื่อควบคุมการเปลี่ยนแปลงคุณสมบัติการแก้ไข คุณไม่ต้องการให้ทุกคนที่สามารถเข้าถึงที่เก็บสามารถแก้ไขคุณสมบัติการแก้ไขทั้งหมดได้ดังนั้นการแก้ไขคุณสมบัติการแก้ไขจะถูกห้ามโดยค่าเริ่มต้น เพื่อให้ผู้ใช้สามารถเปลี่ยนคุณสมบัติได้คุณต้องสร้างpre-revprop-changeเบ็ด

exit 0เบ็ดง่ายสามารถมีเพียงหนึ่งบรรทัด: จะอนุญาตให้ผู้ใช้ที่ได้รับการรับรองความถูกต้องเปลี่ยนแปลงคุณสมบัติการแก้ไขใด ๆ และไม่ควรใช้ในสภาพแวดล้อมจริง บน Windows คุณสามารถใช้ชุดสคริปต์หรือสคริปต์ที่ใช้ PowerShell เพื่อใช้ตรรกะบางอย่างภายในpre-revprop-changeเบ็ด

สคริปต์ PowerShell นี้อนุญาตให้เปลี่ยนsvn:logคุณสมบัติเท่านั้นและปฏิเสธข้อความบันทึกว่างเปล่า

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$rev      = $args[1]
$user     = $args[2]
$propname = $args[3]
$action   = $args[4]

# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
  [Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
  exit 1
}

# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
  [Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
  exit 2
}

# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
  exit 3
}

exit 0

ชุดสคริปต์นี้อนุญาตให้เฉพาะผู้ใช้ "svnmgr" เพื่อเปลี่ยนคุณสมบัติการแก้ไข:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

2

สำหรับผู้ใช้พีซี: นามสกุล. bat ใช้ไม่ได้กับฉันเมื่อใช้กับ Windows Server maching ฉันใช้ VisualSvn ตามที่แนะนำ Django Reinhardt และสร้าง hook ด้วยนามสกุล. cmd


0
  1. ไปที่ไดเรกทอรี SVN repo ในโฟลเดอร์ "hooks" เช่น "D: \ SVN \ hooks \"
  2. สร้างไฟล์ว่าง "pre-revprop-change.bat" ที่นั่น
  3. ในไฟล์เขียน "exit 0" (ไม่มี "") และบันทึก
  4. สนุก :)

(วิธีนี้มีข้อเสียอย่างแน่นอนเนื่องจากไม่มีการตรวจสอบ / ต้องห้าม แต่สำหรับกรณีของฉัน - repo ในพื้นที่ที่ฉันใช้อยู่ - ดูเหมือนว่าจะใช้งานได้)

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