8

バージョン管理下にある version.ini というファイル (/trunk/version.ini) を作成しました。そのファイルを最新バージョンに更新するポスト コミット フックを作成したいと考えています。しかし、どのコマンドでそれができるのかわかりません。私はこのパラメータを持っていることを知っています:

#!/bin/sh

REPOS = "$1"
REV = "$2" 

しかし、新しいリビジョンを作成せずにそのファイルの内容を置き換えるにはどうすればよいですか? 私のレポにまだそれらの変更がありますか?

更新: 明確になっていない可能性があるため、より詳細な説明を試みます: このレポがあるとしましょう: /svn/repos/project/trunk/ で、バージョン管理下にある version.ini というファイルがあります。私がやりたいことは、コミットするたびにそのファイルを新しいリビジョンに更新することです。現在のリビジョンが 263 であるとしましょう。そのファイルに 263 を書き込みたいとします。また、次の回答に応答するには、キーワードを使用できません。これは、そのファイルを更新し、それを実行したくない場合にのみ機能するためです。

私が理にかなっているといいのですが、与えられた助けに感謝します。乾杯

4

2 に答える 2

7

実際に必要なのは、コミットを変更する方法ではなく、svn:keywordsのようなものです。残念ながら、「$GlobalRev$ はどこですか?」というボックスにあるように、これは本当にあなたが望むことをしません。代わりに、 svnversionの出力を呼び出して解析し、その結果をビルドの一部としてファイルに格納するスクリプトを作成する必要があります。

さて、文字通りの質問に答えるために、svn フック スクリプトでできることとできないことについて考えるのは楽しいことです。

コミット後のフックからコミットを変更することはできません

post-commit フックが実行されるまでに、コミットは (名前が示すように) 既にファイナライズされているため、ファイルを変更することは問題外です。この時点では、変更を検査することしかできません。

保留中のコミットを pre-commit フックから変更することもできません

--transaction スイッチを指定してsvnlookツールを使用すると、保留中のトランザクションの内容を pre-commit フックから調べることができますが、変更することはできません。

pre-commit フックで任意の変更を行うことができる場合、明らかにサーバーはこれらの変更を svn クライアントに報告する必要があります。そうしないと、クライアントは自分のファイルがコミットされたリビジョンにあると思い込んでしまいますが、実際には異なっています。svn クライアントがそのような報告された変更を受け入れる場合、コミットによって作業が消去される可能性があります。控えめに言っても、これはバージョン管理システムにとって驚くべき機能です。言うまでもなく、転覆はこれを許可しません。

于 2009-03-17T00:02:18.483 に答える
5

リビジョン番号を変更せずにリポジトリ内の何かを変更する方法はありません。

解決策は、特別なキーワード( を検索svn:keywords) をファイルに入れ、チェックアウト時に SVN に置き換えさせることです。これらの値はリポジトリから取得されているように見えますが、リポジトリ内のファイルの表現は変わりません。

おそらく $LastChangedRevision$ (または略して $Rev$) を探しているでしょう。

別の解決策は、プロジェクトのルート ディレクトリで使用するルールをビルド ツール/Makefile/whatever に追加してsvn info、現在のリビジョンを決定し、それを一時ファイル (リポジトリには追加されません) に入れることです。

于 2009-03-16T12:36:20.550 に答える