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


12

SVNを使用しています。時々、コミットメッセージを書くときに何かを見逃します。しかし、いったんコミットされると、元に戻すことはできず、メッセージを編集することさえできません。なぜ彼らはそこに編集機能を入れなかったのですか?


7
thedailtywtfのDave.cppの物語を思い出す
ファルコン

1
gitを使用するだけで、コミットをマージしたり、メッセージを編集したり、履歴で好きなことをしたりできます。
SKロジック

または、できない場合は、誰でもgit-svn賢くなります。
マシューシャーリー

@Matthew:git-svnを使用すると、履歴編集が無効になっているsvnリポジトリで履歴を変更できますか?
gbjbaanb

2
@gbjbaanb:既にSVNサーバーにプッシュアップしていれば、そうはなりません。ただし、ローカルでのみコミットした場合は、ライブリポジトリにプッシュする前にコミットメッセージを変更できます。
マシューシャーリー

回答:


15

SVN FAQによれば、リポジトリ管理者がリポジトリを有効にしている場合、またはリポジトリへのローカル管理アクセス権がある場合にできます

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


4
@Matthew gitでさえ、いつでも歴史を変えることはひどい考えです。履歴は監査証跡として機能することになっており、いかなる理由であれ、いかなる時点でも決して変更されるべきではありません。
トーマスオーエンズ

2
通常、コミットメッセージを変更する目的はプロジェクトの履歴を追跡しやすくすることであるため、コミットメッセージの監査証跡を作成します。
ピーターテイラー

2
1か月前に入力したコミットメッセージが誤解を招き、混乱させ、まったく間違っていることを発見したとします。間違ったメッセージを見たすべての人に表示される修正表記を追加することはできませんか?(私は、元のメッセージが変更されていない簡単に利用可能であるべき同意し、変更自体が追跡され、タイムスタンプされなければならない。しかし、私は、これは「歴史を変える」を構成することに同意しない。。)
デヴィッド・シュワルツ

2
間違った情報は受け入れられないため、その情報を修正または明確にすることを許可してはなりません。ワオ。ただすごい。
デビッドシュワルツ

3
あなたは正直に自己パロディのように見え始めています。「それは正しくなければならないので、決して修正されてはなりません。」
デビッドシュワルツ

5

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

ここでSVN FAQを確認してください

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

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

$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オプションを使用することもできます。ただし、このオプションを使用する場合は、十分に注意してください。変更の電子メール通知や、リビジョンプロパティを追跡するバックアップシステムなどをバイパスしている可能性があります。

回答カミルKisielに応じて、スタックオーバーフロー上で同様の問題


stackoverflowから回答をコピーして貼り付ける場合、少なくとも引用としてマークし、OP(この場合はKamil Kisiel)にクレジットを与える必要があります。オリジナルへのリンク:stackoverflow.com/questions/304383/…回答を編集してください。さもなければ、私はあなたに投票します。
ファルコン

4

それだから、集中バージョン管理システム -あなたが変更をコミットするとすぐに(とあなたのメッセージをコミットコミットにバインドされた慣習によるもので)、リポジトリへの読み取りアクセス権を持つ誰もがその情報を見ることができます。人々が「現実」についての異なる意見になってしまうため、情報を広めた後に情報を変更することは悪い考えです。

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


彼らは、メッセージ...コミットの複数のバージョンの可能性があります
アレックスFeinman

1
@ l0b0虚偽、誤解を招く、または損害を与えやすい情報を発信し続けることは客観的に悪いことではありませんか?記録保持には、不正なデータを登録する必要はありません。
user179700

1
@ user179700:そのとおりです。私が今まで見たすべてのVCSには、根本的に欠陥のある設計の前提があります。コミットには1つのコミットメッセージがあり、それは不変です。アレックスが言うように、「コミットメッセージの複数のバージョンを許可する」必要があります。
l0b0

@ l0b0考えれば考えるほど、この質問はおもしろいと思います。私の最初の反応は、丁寧に書いてください。現在の慣行は、プロセスを制限しているようです。他のシステムがより堅牢なプラクティスを実装しているかどうかも疑問です。別の質問を考える時間です。+
1-ユーザー179700

@ user179700:現在、コミットメッセージを変更できるスクリプトを作成したいと思っていますが、(タイムスタンプされた)追加の文字列を追加するだけです。これにより、監査証跡を保持しながら間違いを修正できます。
タイナム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.