Tại sao tôi không thể chỉnh sửa tin nhắn cam kết SVN?


12

Tôi đang sử dụng SVN. Đôi khi tôi bỏ lỡ một cái gì đó khi tôi viết một thông điệp cam kết. Nhưng một khi nó đã được cam kết, nó không thể được hoàn nguyên và thậm chí tôi không thể chỉnh sửa tin nhắn. Tại sao họ không đặt chức năng chỉnh sửa trong đó?


7
Nhắc tôi về câu chuyện của Dave.cpp trên thedailtywtf
Falcon

1
Chỉ cần sử dụng git , nó cho phép hợp nhất các cam kết, chỉnh sửa tin nhắn và làm bất cứ điều gì khác mà bạn thích với lịch sử của mình.
SK-logic

Hoặc nếu bạn không thể, thì hãy sử dụng git-svnvà không ai sẽ là người khôn ngoan hơn.
Matthew Scharley

@Matthew: làm thế nào trên trái đất với git-svn cho phép bạn thay đổi lịch sử trong một repo svn bị chỉnh sửa lịch sử?
gbjbaanb

2
@gbjbaanb: Sẽ không, nếu bạn đã được đẩy lên máy chủ SVN. Nhưng nếu bạn chỉ cam kết cục bộ, bạn vẫn có thể thay đổi thông điệp cam kết trước khi đẩy nó vào repo trực tiếp.
Matthew Scharley

Câu trả lời:


15

Theo Câu hỏi thường gặp của SVN, bạn có thể nếu quản trị viên kho lưu trữ đã kích hoạt nó hoặc nếu bạn có quyền truy cập quản trị cục bộ vào kho lưu trữ .

Tuy nhiên, làm điều này có lẽ là một ý tưởng tồi. Bạn, trong thực tế, thay đổi lịch sử. Một trong những điểm của kiểm soát phiên bản là duy trì lịch sử và kiểm toán cho dự án. Cho phép thay đổi tùy ý đối với lịch sử đánh bại dấu vết kiểm toán. Thay vào đó, tôi khuyên bạn nên thực hiện các cam kết nhỏ hơn, viết các thông điệp cam kết ngắn gọn nhưng rõ ràng và cải thiện quy trình làm việc cá nhân của bạn để ngăn chặn các lỗi này.


4
@Matthew Ngay cả trong git, thay đổi lịch sử tại bất kỳ thời điểm nào, theo tôi, là một ý tưởng khủng khiếp. Lịch sử được cho là phục vụ như một dấu vết kiểm toán và không bao giờ được thay đổi bởi bất cứ ai tại bất kỳ thời điểm nào vì bất kỳ lý do gì.
Thomas Owens

2
Vì vậy, có một dấu vết kiểm toán cho thông điệp cam kết, bởi vì thông thường mục đích của việc thay đổi thông điệp cam kết là để làm cho nó dễ dàng hơn để theo dõi lịch sử của dự án.
Peter Taylor

2
Giả sử tôi phát hiện ra rằng một tin nhắn cam kết tôi đã nhập một tháng trước là sai lệch, khó hiểu và hoàn toàn sai . Không phải tôi có thể thêm một ký hiệu sửa lỗi sẽ được nhìn thấy bởi những người nhìn thấy thông báo không chính xác? (Tôi đồng ý thông báo ban đầu nên dễ dàng có sẵn chưa sửa đổi và sự thay đổi bản thân nên được theo dõi và timestamped Nhưng tôi không đồng ý rằng điều này tạo nên "thay đổi lịch sử"..)
David Schwartz

2
Thông tin sai là không thể chấp nhận, do đó mọi người không được phép sửa hoặc làm rõ thông tin đó, vì điều đó sẽ che giấu sự sai lệch của họ. Ồ Chỉ là wow.
David Schwartz

3
Bạn thực sự bắt đầu trông giống như một sự tự nhại. "Nó phải chính xác, do đó nó không bao giờ được sửa chữa."
David Schwartz

5

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

Kiểm tra Câu hỏi thường gặp về SVN tại đây.

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 ra một cái móc gọi là "thay đổi trước khi đổi tên" (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" 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.

Trả lời từ Kamil Kisiel để trả lời một câu hỏi tương tự trên Stack Overflow .


Khi bạn sao chép dán câu trả lời từ stackoverflow, ít nhất bạn nên đánh dấu nó là một trích dẫn và cung cấp tín dụng cho OP (Kamil Kisiel trong trường hợp này). Liên kết đến bản gốc: stackoverflow.com/questions/304383/ Quảng Hãy sửa câu trả lời của bạn hoặc tôi sẽ hạ bệ bạn.
Falcon

4

Bởi vì đó là hệ thống kiểm soát phiên bản tập trung - Ngay sau khi bạn thực hiện thay đổi (và thông điệp cam kết của bạn là theo quy ước ràng buộc với cam kết), mọi người đã đọc quyền truy cập vào kho lưu trữ đều có thể thấy thông tin đó. Đó là một ý tưởng tồi để thay đổi thông tin sau khi nó đã được phổ biến , bởi vì mọi người kết thúc với một ý kiến ​​khác về "thực tế".

Các hệ thống kiểm soát phiên bản phân tán như Git làm giảm bớt vấn đề này bằng cách đảm bảo rằng hành động cung cấp thông tin cho người khác là nguyên tử và không có bất kỳ thông tin bổ sung nào như thông báo cam kết. Nhưng nguyên tắc tương tự được áp dụng ở đây: Bạn không khuyến khích thay đổi mọi thứ cục bộ mà bạn đã cung cấp cho người khác.


Họ có thể cho phép nhiều phiên bản của thông điệp cam kết ...
Alex Feinman

1
@ l0b0 không phải là khách quan tồi tệ hơn khi tiếp tục phổ biến thông tin sai lệch, gây hiểu lầm hoặc dễ gây thiệt hại? Lưu trữ hồ sơ không yêu cầu lưu trữ dữ liệu xấu.
dùng179700

1
@ user179700: Bạn nói đúng. Có một giả định thiết kế thiếu sót cơ bản trong tất cả các VCS tôi từng thấy: Một cam kết có một thông điệp cam kết, đó là bất biến. Như Alex nói, chúng ta nên "cho phép nhiều phiên bản của thông điệp cam kết".
l0b0

@ l0b0 Tôi thấy câu hỏi này thú vị hơn khi tôi xem xét nó. Phản ứng đầu tiên của tôi là dọc theo dòng, chỉ cần viết cẩn thận hơn. Thực tế hiện nay dường như cản trở quá trình. Tôi quá tự hỏi nếu có bất kỳ hệ thống khác thực hiện một thực hành mạnh mẽ hơn. Thời gian cho một câu hỏi khác methinks. +1
dùng179700

@ user179700: Hiện tại tôi đang hy vọng viết ra một tập lệnh cho phép bạn thay đổi một thông điệp cam kết, nhưng chỉ bằng cách thêm một chuỗi bổ sung (được đánh dấu thời gian). Điều đó cho phép bạn sửa chữa sai lầm trong khi bảo tồn dấu vết kiểm toán.
Tynam
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.