Làm cách nào để chỉnh sửa thông điệp tường trình đã được cam kết trong Subversion?


550

Có cách nào để chỉnh sửa thông điệp tường trình của một sửa đổi nhất định trong Subversion không? Tôi đã vô tình viết sai tên tệp trong tin nhắn cam kết của tôi có thể gây nhầm lẫn sau này.

Tôi đã thấy Làm cách nào để chỉnh sửa thông báo cam kết không chính xác trong Git? , nhưng giải pháp cho câu hỏi đó dường như không giống với Subversion (theo svn help commit).


26
Tôi sẽ đưa ra câu hỏi này, nhưng sau đó tôi nhận ra mình đã làm 4 tháng trước :)
oksayt

6
Nếu đó là mã, chỉ cần thực hiện một số ý kiến ​​và cam kết một lần nữa với các ý kiến ​​phù hợp. Nếu bạn ổn với ý kiến ​​của bạn phản ánh sai lầm, nó sẽ ít nỗ lực hơn và nhanh hơn nhiều. Nếu không phải là giải pháp của Kamil Kisiel rõ ràng là cách đúng đắn để làm điều đó.
Marty

Có một pre-revprop-changekịch bản tuyệt vời cho phép người dùng cam kết sửa đổi nhật ký của họ trong tối đa 3 giờ sau khi cam kết. Đây là một sự thỏa hiệp tuyệt vời giữa các bản ghi linh hoạt / chính xác và duy trì tính trung thực của kho lưu trữ: Wandisco.com/svnforum/threads/ Kẻ
jwa

nếu bạn không thể thay đổi tập tin nhưng vẫn muốn thêm một thông điệp cam kết mới thì bạn có thể làmsvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

Câu trả lời:


457

Về cơ bản, bạn phải có quyền quản trị (trực tiếp hoặc gián tiếp) vào kho lưu trữ để thực hiện việc này. Bạn có thể định cấu hình kho lưu trữ để cho phép tất cả người dùng thực hiện việc này hoặc bạn có thể sửa đổi thông điệp tường trình trực tiếp trên máy chủ.

Xem phần này của Câu hỏi thường gặp về Subversion (nhấn mạnh của tôi):

Thông điệp tường trình được lưu giữ trong kho lưu trữ dưới dạng các thuộc tính được đính kèm với mỗi lần sửa đổi. Theo mặc định, thuộc tính thông điệp tường trình (svn: log) không thể được chỉnh sửa sau khi được cam kết . Đó là bởi vì các thay đổi đối với các thuộc tính sửa đổi (trong đó svn: log là một) khiến giá trị trước đó của thuộc tính bị loại bỏ vĩnh viễn và Subversion cố gắng ngăn bạn vô tình làm điều này. Tuy nhiên, có một vài cách để Subversion thay đổi thuộc tính sửa đổi.

Cách đầu tiên là để người quản trị kho lưu trữ kích hoạt sửa đổi thuộc tính sửa đổi. Điều này được thực hiện bằng cách tạo một hook có tên là "pre-revprop-change" (xem phần này trong sách Subversion để biết thêm chi tiết về cách thực hiện việc này). Móc "thay đổi trước khi đổi tên" có quyền truy cập vào thông điệp tường trình cũ trước khi nó được thay đổi, do đó nó có thể bảo vệ nó theo một cách nào đó (ví dụ: bằng cách gửi email). Khi sửa đổi thuộc tính sửa đổi được bật, bạn có thể thay đổi thông điệp nhật ký của sửa đổi bằng cách chuyển công tắc --revprop sang svn propedit hoặc svn propset, như một trong những điều sau:

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

Trong đó N là số sửa đổi có thông điệp tường trình bạn muốn thay đổi và URL là vị trí của kho lưu trữ. Nếu bạn chạy lệnh này từ trong một bản sao đang hoạt động, bạn có thể bỏ URL.

Cách thứ hai để thay đổi một thông điệp tường trình là sử dụng setlog svnadmin. Điều này phải được thực hiện bằng cách tham khảo vị trí của kho lưu trữ trên hệ thống tập tin. Bạn không thể sửa đổi một kho lưu trữ từ xa bằng cách sử dụng lệnh này.

$ svnadmin setlog REPOS_PATH -r N FILE

Trong đó REPOS_PATH là vị trí kho lưu trữ, N là số sửa đổi có thông điệp tường trình bạn muốn thay đổi và FILE là một tệp chứa thông điệp tường trình mới. Nếu hook "pre-revprop-thay đổi" không được đặt đúng chỗ (hoặc bạn muốn bỏ qua tập lệnh hook vì một số lý do), bạn cũng có thể sử dụng tùy chọn --bypass-hook. Tuy nhiên, nếu bạn quyết định sử dụng tùy chọn này, hãy thật cẩn thận. Bạn có thể bỏ qua những thứ như thông báo email về thay đổi hoặc hệ thống dự phòng theo dõi các thuộc tính sửa đổi.


15
Kể từ ngày 3 tháng 2 năm 2010, URL là subversion.apache.org/faq.html#change-log-msg
GreenMatt

1
Đây là một triển khai cơ bản cho tùy chọn svnadmin svn-change-commit
albfan

2
Cảm ơn! Vẫn hữu ích 6,5 năm sau câu trả lời. :-)
Michael

Phương pháp propedit ít nhiều hoạt động; tuy nhiên, tôi không thể thay đổi nhật ký để phản ánh trong trình duyệt repo. Tôi chỉ có thể thấy dòng lệnh svn đăng nhập được cập nhật trong Windows. Tôi đã phải làm mới bộ đệm nhật ký như là bước cuối cùng: stackoverflow.com/questions/25750249/ trên
user_007

89

Khi bạn chạy lệnh này,

svn propedit svn:log --revprop -r NNN 

và chỉ trong trường hợp bạn thấy thông báo này:

Yêu cầu DAV không thành công; có thể là hook thay đổi trước khi khởi động lại của kho lưu trữ không thành công hoặc không tồn tại

Đó là vì Subversion không cho phép bạn sửa đổi thông điệp tường trình vì chúng không được đảo ngược và sẽ bị mất vĩnh viễn.

SVN lưu trữ Unix

Chuyển đến thư mục hook trên máy chủ Subversion của bạn (thay thế ~ / svn / reponame bằng thư mục của kho lưu trữ của bạn)

cd ~/svn/reponame/hooks

Xóa phần mở rộng

mv pre-revprop-change.tmpl pre-revprop-change

Làm cho nó thực thi (không thể làm chmod + x!)

chmod 755 pre-revprop-change

Nguồn

SVN được lưu trữ trên Windows

Các tệp mẫu trong thư mục hook có thể được sử dụng vì chúng dành riêng cho Unix. Bạn cần sao chép tệp bó Windows pre-revprop-change.batvào thư mục hook, ví dụ: tệp được cung cấp ở đây .


1
Tại sao bạn viết trong ngoặc " không thể làm chmod + x!"?
Sứ đồ

1
Tôi đã tạo một tập lệnh nhỏ thực hiện cùng một ý tưởng ở đây blog.mmonem.com/enable-changing-svn-log
mmonem

SVN_EDITOR, VISUAL hoặc EDITOR cần được đặt trước khi sử dụng svn propedit
Gerd

48

Đây là một biến thể tiện dụng mà tôi không thấy được đề cập trong faq. Bạn có thể trả về tin nhắn hiện tại để chỉnh sửa bằng cách chỉ định trình soạn thảo văn bản.

svn propedit svn:log --revprop -r N --editor-cmd vim

17
Nó yêu cầu hook đã được tạo - đòi hỏi quyền quản trị. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt

Đây là tập lệnh để kích hoạt nhật ký: blog.mmonem.com/enable-changing-svn-log
mmonem

37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt

Tôi đang sử dụng Google Code vì vậy tôi không nghĩ mình có thể làm theo cách này, nhưng cảm ơn.
Jeremy Ruten

4
điều này làm việc với tôi vì phương pháp propedit không thành công với "Kho lưu trữ chưa được kích hoạt để chấp nhận các thay đổi sửa đổi". cảm ơn!
pfctdayelise

1
+1 để đưa ra lệnh trực tiếp :-) apache.org đã ngừng hoạt động ngay bây giờ và tôi không thể theo bất kỳ liên kết cụ thể nào ...
Rafa

Câu trả lời này xứng đáng nhiều điểm hơn! Nó là tốt hơn bởi vì bạn không phải thiết lập hook để sử dụng nó.
Peri Hartman

1
vết sưng cho câu trả lời này, làm việc cho tôi mà không cần thiết lập hook, cũng không thay đổi "ngày / giờ" sửa đổi trong nhật ký, chỉ là tin nhắn, đó chính xác là những gì tôi đang hy vọng.
segFaultCoder

17

Gần đây tôi đã được giao nhiệm vụ này.

Chúng tôi muốn cho phép các lập trình viên của chúng tôi chỉ sửa đổi các thông điệp cam kết của riêng họ và hạn chế khoảng thời gian họ được phép làm như vậy. Chúng tôi quyết định họ sẽ được phép sửa đổi bất kỳ thông điệp tường trình nào được cam kết vào ngày hôm đó, để sửa lỗi của v.v.

Sau khi xem xét một vài ví dụ trực tuyến khác, tôi đã hack nó cùng nhau, chúng tôi đang ở trong một môi trường windows, vì vậy đây là nội dung của chúng tôi về pre-revprop-change.bat:

@ECHO OFF

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify their own log messages
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set AUTHOR=
for /f "delims=" %%a in ('svnlook author -r %REV% %REPOS%') do @set AUTHOR=%%a

if /I not '%AUTHOR%'=='%user%' goto ERROR_WRONGUSER

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify log messages from today, old messages locked down
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set DATESTAMP=
for /f "delims=" %%a in ('svnlook date -r %REV% %REPOS%') do @set DATESTAMP=%%a

for /F "tokens=1-2 delims= " %%a in ("%DATESTAMP%") do (
 set DATESTAMPDATE=%%a
 set DATESTAMPTIME=%%b )

:: Expects DATESTAMPDATE in the format: 2012-02-24
for /F "tokens=1-3 delims=-" %%a in ("%DATESTAMPDATE%") do (
 set DATESTAMPYEAR=%%a
 set DATESTAMPMONTH=%%b
 set DATESTAMPDAY=%%c )

:: Expects date in the format: Thu 08/01/2013
for /F "tokens=1-4 delims=/ " %%a in ("%date%") do (
 set YEAR=%%d
 set MONTH=%%b
 set DAY=%%c )

if /I not '%DATESTAMPYEAR%'=='%YEAR%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPMONTH%'=='%MONTH%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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 properties are not allowed. >&2
goto ERROR_EXIT

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

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

:ERROR_WRONGUSER
echo You are not allowed to modify other user's log messages. >&2
goto ERROR_EXIT

:ERROR_MSGTOOOLD
echo You are not allowed to modify log messages older than today. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1 

Chỉnh sửa: Ý tưởng ban đầu cho điều này đến từ chủ đề này :


7
Vì một số lý do, trên hệ thống của tôi (chạy Server 2012 và VisualSVN), trong lần kiểm tra ngày cuối cùng if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, tôi đã phải chuyển sang dấu ngoặc kép xung quanh hai biến. (Bạn sẽ không tin mất bao lâu để tìm ra.) Nếu không, tôi sẽ nhận được những thứ như "== '02' là bất ngờ vào lúc này" (vào ngày 2 của tháng). Lô-fu của tôi không đủ mạnh để biết tại sao điều đó xảy ra, nhưng trong trường hợp bất kỳ ai khác gặp phải vấn đề kỳ lạ, nó có thể giúp ích.
Carl Bussema

@CarlBussema: Cảm ơn vì miếng ngon đó. Bạn vừa cứu tôi một cơn đau đầu rất lớn.
Daniel Szabo

1
Cũng lưu ý rằng tập lệnh ở trên sử dụng định dạng ngày của người Mỹ, "Mong đợi ngày ở định dạng: Thu 08/01/2013" . Vì vậy, nếu bạn không sử dụng mà bạn cần phải sửa đổi phần đó, trong trường hợp của tôi định dạng là "MM.DD.YY", và không có các ngày trong tuần.
Zitrax 7/10/2015

Đó là một biến thể thú vị cho câu trả lời hay này: stackoverflow.com/questions/6155/iêu
NateJ

17

Trên Windows, sử dụng máy khách Rùa SVN:

  1. nhấp chuột phải vào thư mục dự án của bạn và chọn "Hiển thị nhật ký"
  2. trong cửa sổ Tin nhắn Nhật ký, nhấp chuột phải vào bản sửa đổi và chọn "Chỉnh sửa thông điệp nhật ký"

Nếu nó không hoạt động thì có thể do cách thiết lập SVN trên máy chủ, hãy đọc các phản hồi khác tại đây.


Cảm ơn đây là một giải pháp dễ dàng hơn cho tôi, +1. Là điều cần thiết để có quyền.
theGabyRod

12

Nếu bạn đang sử dụng một IDE như nhật thực, bạn có thể sử dụng cách dễ dàng này.

Right click on the project -> Team - Show history

Trong đó right click on the revision id for your commit and select 'Set commit properties'.

Bạn có thể sửa đổi tin nhắn như bạn muốn từ đây.


Ít nhất là trong TortoiseSVN, cố gắng chỉnh sửa các thuộc tính cam kết cho một cam kết trong nhật ký cam kết không thành công với cùng một thông báo lỗi như cố gắng chỉnh sửa trực tiếp thông điệp tường trình.
Christian Severin

1
"Yêu cầu DAV không thành công; có thể là hook thay đổi trước khi đổi lại của kho lưu trữ không thành công hoặc Kho lưu trữ không tồn tại không được kích hoạt để chấp nhận các thay đổi sửa đổi; yêu cầu quản trị viên tạo một hook thay đổi trước khi đổi" Nhưng như tôi đã nói: đó là sử dụng TortoiseSVN (với tư cách là người không phải quản trị viên), không phải Eclipse. Có lẽ Eclipse đã hack các quyền SVN để tạo ra cái móc đó, tôi không biết.
Christian Severin

Có thể. Hãy thử làm điều đó trong nhật thực.
mani_nz

@ChristianSeverin, tôi nhận được thông báo lỗi tương tự khi sử dụng Eclipse. Nó chắc chắn đến từ máy chủ Subversion.
GreenhouseVeg

10

Nếu kho lưu trữ của bạn cho phép thiết lập các thuộc tính sửa đổi thông qua hook thay đổi trước khi đổi, bạn có thể thay đổi thông điệp tường trình dễ dàng hơn nhiều.

svn propedit --revprop -r 1234 svn:log url://to/repository

Hoặc trong TortoiseSVN, AnkhSVN và có thể nhiều khách hàng lật đổ khác bằng cách nhấp chuột phải vào mục nhật ký và sau đó 'thay đổi thông điệp nhật ký'.


2
trong Subclipse (Eclipse), nó là "Đặt thuộc tính cam kết".
pfctdayelise

2

Câu hỏi thường gặp về Subversion bao gồm điều này, nhưng sử dụng một loạt các thuật ngữ không xác định khó hiểu như REPOS_PATHkhông đưa ra bất kỳ ví dụ thực tế nào.

Có thể mất một vài lần để làm cho nó hoạt động, vì vậy hãy lưu thông điệp cam kết đã cập nhật của bạn vào một tệp. Không giống như svn-commit.tmpcác tệp, Subversion sẽ không duy trì việc gõ của bạn nếu có vấn đề.

Trong thư mục làm việc của bạn, chạy

svn propedit -r N --revprop svn:log

để chỉnh sửa thông điệp cam kết. Nếu điều đó làm việc, tuyệt vời! Nhưng nó có lẽ sẽ không, bởi vì svn:logtài sản sửa đổi là không phiên bản và Subversion theo mặc định sẽ ngăn chặn bạn ghi đè lên nó, hoặc là với kịch bản móc pre-revprop-change , hoặc một thông báo lỗi rằng bạn không có một cái móc như vậy.

Để thay đổi các hook, bạn cần truy cập vào hệ thống tập tin lưu trữ trên đó. svn infosẽ cho bạn biết kho lưu trữ gốc. Giả sử nó ~/svnrepo.

  1. cd đến ~/svnrepo/hooks
  2. Có một pre-revprop-changehoặc pre-revprop-change.batkịch bản? Nếu vậy, tạm thời nhận xét phần của nó sẽ hủy bỏ nếu bạn cố gắng thay đổi svn:log.
  3. Nếu không, trên Windows, tạo một tệp trống có tên pre-revprop-change.bat. Đây là một cách để làm điều đó:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Nếu không, trên Unix, hãy chạy

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. Trong bản sao làm việc, chạy svn propedit -r N --revprop svn:loglại

  6. Hoàn tác các thay đổi của bạn thành ~/svnrepo/hooks/svn-revprop-change( .bat)

0

Tôi tìm thấy một thực hiện tốt đẹp của phía máy chủ trước rev-prop-change móc tại svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-allow-commiters-to-change-own-log-during-x-hours

Nó thực hiện

  • người dùng kiểm tra, đó chỉ là thông điệp cam kết riêng có thể được chỉnh sửa.
  • Ghi đè quản trị viên Svn; quản trị viên có thể chỉnh sửa bất cứ điều gì.
  • so sánh tem thời gian: chỉ có thể chỉnh sửa các cam kết trẻ hơn thời gian nhất định

Lấy nó từ đó và chỉnh sửa theo ý thích. Tôi không muốn sao chép nó ở đây vì tôi không phải là tác giả gốc và không có thông báo bản quyền nào cho phép tôi làm điều đó.

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.