Móc thay đổi trước khi đổi tên trong SVN là gì và làm cách nào để tạo nó?


168

Tôi muốn chỉnh sửa một nhận xét nhật ký trong trình duyệt kho lưu trữ và nhận được thông báo lỗi rằng không có hook thay đổi trước khi thay đổi trước cho kho lưu trữ. Bên cạnh việc có một cái tên đáng sợ, một cái móc thay đổi trước khi đổi tên là gì và làm cách nào để tạo ra nó?


16
bây giờ liên kết này là liên kết thứ hai, chỉ sau một liên kết đến câu hỏi này :)
ULyskes

Liên kết về khách hàng tiềm năng đến SVNBook 1.0 đã lỗi thời. Một hiện nay là 1,7 và 1,8 (đêm): svnbook.red-bean.com/en/1.8
bahrep

Câu trả lời:


52

Về cơ bản, đó là một tập lệnh được khởi chạy trước khi thuộc tính không đảo ngược được sửa đổi trên kho lưu trữ, để bạn có thể quản lý chính xác hơn những gì đang xảy ra trên kho lưu trữ của mình.

Có các mẫu trong bản phân phối SVN cho các hook khác nhau, nằm trong thư mục con / hook (* .tmpl mà bạn phải chỉnh sửa và đổi tên tùy theo HĐH, để kích hoạt).


2
Tất cả các hướng dẫn là trong kịch bản mẫu hook. Nếu bạn cần hook cho một svnsyncbản sao, thì kịch bản mặc định sẽ cần được thay đổi, bởi vì nó chỉ cho phép thay đổi thành svn: log. Svnsync thay đổi nhiều hơn thế này, vì vậy tôi chỉ cần đặt một cái exit 0ở đó để cho phép tất cả các thay đổi thuộc tính (vì đây chỉ là một tấm gương cho tôi).
Matt Connolly

... sau đó lưu nó pre-revprop-changevào cùng thư mục và làm cho nó có thể thực thi được đối với người dùng máy chủ web (trên Linux).
Mateng

209

Đối với Windows, đây là liên kết đến tệp bó ví dụ chỉ cho phép thay đổi thông điệp tường trình (không phải thuộc tính khác):

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

Về cơ bản sao chép mã dưới đây vào một tệp văn bản và đặt tên cho nó pre-revprop-change.batvà lưu nó trong \hooksthư mục con cho kho lưu trữ của bạn.

@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
Có thể đã liên kết với phiên bản có stackoverflow.com/questions/6155/ . Tôi đã viết cái móc đó và đăng nó lên diễn đàn SVN một lúc trước. Tôi đoán tôi nên đã đặt một số tín dụng trong các ý kiến ​​hook.
Philibert Perusse

1
Tôi đang sử dụng tập lệnh này với VisualSVN 2.0.8 và TortoiseSVN 1.6.11 và nó hoạt động tốt.
Đánh dấu Biek

27
Bạn có thể chỉnh sửa các móc trong VisualSVN bằng cách bấm chuột phải vào tên kho lưu trữ của bạn trong VisualSVN Server và chọn "Thuộc tính ...". Bạn sẽ thấy một tab "Móc". Trong đó bạn sẽ thấy các loại móc khác nhau có sẵn. Chọn đúng, nhấp vào "Chỉnh sửa" và dán mã ở trên vào đó. Hy vọng rằng sẽ giúp người dùng VisualSVN!
Chuck Le Mông

Làm việc cho tôi vô hiệu hóa dòng: if / I not "% action%" == "M" goto ERROR_ACTION. Cách khác, nó cứ nói chỉ sửa đổi cho phép.
Nathan

6
Phương pháp nhanh và bẩn cho windows là tạo một tệp trống có tên hook \ pre-revprop-change.bat
Ben Claar

18

Để Linux cho phép phiên bản nhận xét nhật ký,

  • định vị tệp pre-revprop-change.tmpltrong hooksthư mục kho lưu trữ của bạn
  • sao chép tập tin vào cùng thư mục, đổi tên nó thành pre-revprop-change
  • cấp quyền thực thi cho tệp (đối với người dùng máy chủ, vd www-data)

Đã chỉnh sửa: (nhờ lindes)

  • sau đó, bạn có thể phải chỉnh sửa tập lệnh để trả về giá trị thoát 0cho loại chỉnh sửa mà bạn muốn cho phép.

Điều này là không đủ ... người ta vẫn cần thay đổi các giá trị thoát một cách thích hợp. Nhưng dù sao tôi cũng thấy nó hữu ích, như một con trỏ đến đúng nơi để tìm ... điều mà một số câu trả lời khác còn thiếu hoặc đưa ra câu trả lời cụ thể cho cửa sổ. Vì vậy, cảm ơn vì điều này.
buộc

1
Tôi khá chắc chắn, trong phiên bản Ubuntu Linux của tôi sao chép và cấp phép là đủ. Nhưng tôi không biết chắc nữa. Tôi đã chỉnh sửa câu trả lời cho phù hợp. Cảm ơn.
Alois Heimer

Chà, tôi chắc chắn rằng nó không hoạt động với tôi như khi tôi dùng thử 2 ngày trước và thêm nhận xét này. Với chỉnh sửa, mặc dù, câu trả lời này làm việc cho tôi.
buộc

11

Dưới đây là liên kết đến câu hỏi tràn stack với nhiều hook phổ biến Các loại Subversion Hook , bao gồm cả nguồn gốc của pre-revprop-changehook cho Windows được đăng chéo tại đây.

Bạn nên tham khảo ở đó vì họ có thể được cải thiện theo thời gian.


7

Cảm ơn #patmortech

Và tôi đã thêm mã của bạn vào đó "chỉ cùng một người dùng có thể thay đổi mã của anh ấy".

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

Tên của tập lệnh hook không quá đáng sợ nếu bạn quản lý giải mã nó: đó là hook thay đổi thuộc tính sửa đổi trước . Nói tóm lại, mục đích của pre-revprop-changetập lệnh hook là kiểm soát các thay đổi của các thuộc tính (sửa đổi) không đảo ngược và gửi thông báo (ví dụ để gửi email khi thay đổi thuộc tính sửa đổi).

Có 2 loại thuộc tính trong Subversion:

  • thuộc tính được phiên bản (ví dụ svn:needs-locksvn:mime-type) có thể được đặt trên các tệp và thư mục,
  • thuộc tính unversioned (sửa đổi) (ví dụ svn:logsvn:date) được thiết lập trên phiên bản kho lưu trữ .

Các thuộc tính được phiên bản có lịch sử và có thể được thao tác bởi người dùng thông thường có quyền truy cập Đọc / Ghi vào kho lưu trữ. Mặt khác, các thuộc tính không đảo ngược không có bất kỳ lịch sử nào và chủ yếu phục vụ mục đích bảo trì. Ví dụ: nếu bạn cam kết sửa đổi, ngay lập tức sẽ svn:datecó thời gian UTC của cam kết của bạn, svn:authorvới tên người dùng và svn:logvới thông điệp nhật ký cam kết của bạn (nếu bạn đã chỉ định bất kỳ).

Như tôi đã chỉ định, mục đích của pre-revprop-changetập lệnh hook là kiểm soát các thay đổi của các thuộc tính sửa đổi. Bạn không muốn tất cả những người có quyền truy cập vào kho lưu trữ có thể sửa đổi tất cả các thuộc tính sửa đổi, vì vậy việc thay đổi thuộc tính sửa đổi bị cấm theo mặc định. Để cho phép người dùng thay đổi thuộc tính, bạn phải tạo pre-revprop-changehook.

Móc đơn giản nhất có thể chứa chỉ một dòng : exit 0. Nó sẽ cho phép bất kỳ người dùng được xác thực nào thay đổi bất kỳ thuộc tính sửa đổi nào và nó không nên được sử dụng trong môi trường thực. Trên Windows, bạn có thể sử dụng tập lệnh bó hoặc tập lệnh dựa trên PowerShell để triển khai một số logic trong pre-revprop-changehook.

Tập lệnh PowerShell này chỉ cho phép thay đổi thuộc svn:logtính và từ chối các thông báo nhật ký trống.

# 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

Tập lệnh bó này chỉ cho phép người dùng "svnmgr" thay đổi thuộc tính sửa đổi:

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

exit 1
goto :eof

:label1
exit 0

2

Đối với người dùng PC: Tiện ích mở rộng .bat không hoạt động với tôi khi được sử dụng trên máy chủ Windows Server. Tôi đã sử dụng VisualSvn như Django Reinhardt đề xuất và nó đã tạo ra một hook với phần mở rộng .cmd.


0
  1. Chuyển đến thư mục repo SVN vào "hook" thư mục con, ví dụ: "D: \ SVN \ hook \"
  2. tạo tập tin trống "pre-revprop-change.bat" ở đó
  3. trong tệp ghi "exit 0" (không có "") và lưu nó
  4. thưởng thức :)

(Giải pháp này chắc chắn có nhược điểm, vì không có gì được kiểm tra / cấm. Nhưng đối với trường hợp của tôi - một repo địa phương mà chỉ tôi đang sử dụng - có vẻ như nó hoạt động.)

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.