web-dev-qa-db-ja.com

SVNコミットメッセージを編集できないのはなぜですか?

SVNを使用しています。コミットメッセージを書き込むときに、何かを見落とすことがあります。ただし、いったんコミットすると、元に戻すことはできず、メッセージを編集することもできません。なぜ彼らはそれに編集機能を入れなかったのですか?

12
Sanghyun Lee

SVN FAQによると リポジトリ管理者が有効にした場合、またはリポジトリへのローカル管理アクセス権がある場合

ただし、これはおそらく悪い考えです。あなたは事実上、歴史を変えています。バージョン管理のポイントの1つは、プロジェクトの履歴と監査証跡を維持することです。履歴に任意の変更を許可すると、監査証跡が無効になります。代わりに、より小さなコミットを実行し、簡潔で明確なコミットメッセージを記述し、これらのエラーを防ぐために個人のワークフローを改善することをお勧めします。

15
Thomas Owens

基本的に、これを行うには、リポジトリへの(直接または間接的に)管理者権限が必要です。すべてのユーザーがこれを実行できるようにリポジトリを構成するか、サーバーでログメッセージを直接変更できます。

SVN [〜#〜] faq [〜#〜] をここで確認してください。

ログメッセージは、各リビジョンに添付されたプロパティとしてリポジトリに保持されます。デフォルトでは、ログメッセージプロパティ(svn:log)は、いったんコミットすると編集できません。これは、リビジョンプロパティ(svn:logが1)の変更により、プロパティの以前の値が永久に破棄され、Subversionが誤ってこれを行わないようにするためです。ただし、Subversionでリビジョンプロパティを変更するには、いくつかの方法があります。

最初の方法は、リポジトリ管理者がリビジョンプロパティの変更を有効にすることです。これは、「pre-revprop-change」と呼ばれるフックを作成することによって行われます(これを行う方法の詳細については、Subversion bookのこのセクションを参照してください)。 「pre-revprop-change」フックは、変更前の古いログメッセージにアクセスできるため、何らかの方法で(たとえば、電子メールを送信することによって)保存することができます。リビジョンプロパティの変更が有効になったら、次のいずれかのように、-revpropスイッチをsvn propeditまたはsvn propsetに渡すことで、リビジョンのログメッセージを変更できます。

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

ここで、Nは変更するログメッセージのリビジョン番号、URLはリポジトリの場所です。このコマンドを作業コピー内から実行する場合は、URLを省略できます。

ログメッセージを変更する2番目の方法は、svnadmin setlogを使用することです。これは、ファイルシステム上のリポジトリの場所を参照して行う必要があります。このコマンドを使用してリモートリポジトリを変更することはできません。

$ svnadmin setlog REPOS_PATH -r N FILE

ここで、REPOS_PATHはリポジトリの場所、Nは変更するログメッセージのリビジョン番号、FILEは新しいログメッセージを含むファイルです。 「pre-revprop-change」フックが設定されていない場合(または、何らかの理由でフックスクリプトをバイパスしたい場合)、-bypass-hooksオプションを使用することもできます。ただし、このオプションを使用する場合は、十分に注意してください。変更の電子メール通知や、リビジョンプロパティを追跡するバックアップシステムなどをバイパスしている可能性があります。

スタックオーバーフローに関する同様の質問 への回答として Kamil Kisiel からの回答。

5

centralizedversion control system であるため、変更をコミットすると(そしてコミットメッセージは通常、コミットにバインドされます)、リポジトリへの読み取りアクセス権があると、その情報を見ることができます。 人々が「現実」について異なる意見を抱くようになるため、情報が普及した後に情報を変更することは悪い考えです

Gitのような分散バージョン管理システムは、他の人が情報を利用できるようにする行為がアトミックであり、コミットメッセージなどの追加情報がないことを確認することで、この問題を軽減します。しかし、同じ原則がここでも当てはまります。すでに他の人が利用できるようにしているものをローカルで変更することはできません。

4
l0b0