5

Pub と Priv という 2 つの別々のリポジトリに広がるソフトウェアを考えてみましょう。Pub リポジトリは公開されています。プライベートは閉鎖されています。継続的インテグレーション サーバーは、どちらかの側が変更されると、Pub と Priv の両方を構築します。次に、Pub のユーザーが利用できるダウンロード可能なバイナリを Priv から作成します。これらのバイナリには、内部およびファイル名にサブバージョン リビジョンのラベルが付けられます。

質問: Pub からビルドされたプログラムに対応する正しい Priv リビジョン番号を認識させて、自動ダウンロードして実行できるようにするにはどうすればよいですか?

現在の解決策は、ビルド サーバーが Pub のファイルを変更して Priv のリビジョン番号を設定し、それらの変更を Pub にコミットすることです。ただし、これには 2 つの重大な問題があります。

  1. ビルドには時間がかかるため、ビルド中に誰かが変更を Pub (または Priv) にコミットすると、競合が発生します。これは強制的に解決できますが、ログ履歴は、それらのリビジョンがそのビルドに組み込まれたかのように奇妙に見えます。

  2. Subversion ログには、「Auto build updated the version」のようなエントリが多数あります。ビルドが実行されるたびに、それ以外の場合は有益な Subversion ログが汚染されます。

したがって、リポジトリを変更する必要のない方法でこれを行うことができます。

ウェイン

4

3 に答える 3

2

リビジョン プロパティ(「バージョン管理されていないプロパティ」というタイトルのセクションを参照) を使用して、Pub の適切なリビジョンに対して Priv の適切なリビジョンを保存できます。リビジョン プロパティの良い点は、コミットが必要ないことです。したがって、履歴の汚染はありません。

Subversion の用語では、リビジョン プロパティは、バージョン管理されたフォルダーではなく、特定のリビジョンに関連付けられます。これらのプロパティは、ファイルまたはフォルダーに添付されるプロパティとは異なり、バージョン管理されていません。それらはすぐに適用されます。--revprop スイッチを「svn propset」に使用すると、リビジョン プロパティが追加されます。TortoiseSVN では、ファイルやフォルダのプロパティではなく、履歴ログ (リビジョンを右クリックして [リビジョン プロパティを表示] を選択) を介して追加され、コミットを行わずにすぐに適用されます。

たとえば、Priv の r1234 を Pub の r6789 に関連付けるには、Pub のチェックアウトからこれを行うことができます。

svn propset --revprop -r6789 "priv:version" "1234"

Pubのr6789がビルドされたら、これを行うことができます

svn propget --revprop -r6789 "priv:version"

Priv の適切なリビジョン番号を取得します。最後の Priv ビルドの後に発生する他のコミットに対処するために、スクリプトは値を取得するまで各リビジョンに「priv:version」を要求して履歴を「たどる」必要があります。または、発生した各リビジョンにプロパティをコピーするポストコミット フックを使用することもできます。

しかし、1つの問題があります。リビジョン プロパティを操作できる pre-revprop-change フックが必要です。最も簡単な方法は、常に 0 を返すようにして、任意の revprop を許可することです。Windows では、hooks ディレクトリに空の「pre-revprop-change.bat」ファイルを作成するだけです。プロパティを作成するときに提供されるサンプル フック スクリプトを見ると、実際にはかなり詳細に文書化されています。

于 2009-11-06T10:27:45.910 に答える
0

これを行う方法はいくつか考えられます。何らかの理由で、リビジョン番号を互いに直接対応させることができないと思います。これは、明白で最も簡単な解決策です。

1 つの方法は、"Corresponds to Priv r1234" のように、Pub へのコミット メッセージを使用して、対応する Priv リビジョンへのポインターを含めることです。

もう 1 つは、Priv からのコミットが Pub にプッシュされるたびに更新される、単純なデータベースやテキスト ファイルなど、リポジトリの外部に通信を格納することです。

さらに別の方法は、現在行っているように Priv リビジョンを記録するために別のコミットを行うのではなく、記録されるはずのコミットにその変更を追加することです。

于 2009-11-06T09:56:16.643 に答える
0

申し訳ありませんが、stackoverflow では、この質問をしたときに登録していなかったため、自分自身またはあなたの回答に対する返信または編集を禁止しています。では、ここで回答を...

サイモン: ありがとう。リビジョン プロパティをコミットする必要がないと提案するのはなぜですか? nant ビルド スクリプトは現在、マージと再統合のためにブランチ バージョンを追跡するためにリビジョン プロパティを使用しています (svn の組み込みマージ機能はあまりにも簡単に混乱します)。ただし、これらのリビジョン プロパティは中央リポジトリにコミットする必要があり、リンクはこれに使用されているのと同じタイプのリビジョン プロパティを参照しています。他のタイプのリビジョン プロパティを参照していますか?

クリティカル スキル: はい。「バージョン 0.5.6.1049 に更新された Autobuild」をコミットするためのメッセージはカスタマイズ可能です。そのコミットは、Hudson を使用して CI によって実行される nant ビルド スクリプトで実際に発生します。また、Pub へのすべてのコミットの後に、ログを汚染する自動化されたメッセージが 1 つ (または複数) 続くため、そのコミットを排除したいことを思い出してください。

Mark: re: Priv へのポインタをコミットします。pub に commit したユーザーは Priv にアクセスできないため、どのリビジョンかわかりません。それ以外の場合は良い考えです。一方、自動化されたビルドは、pub と priv をビルドするときにこれを行いますが、他の実質的な変更がないバージョンを Priv にリンクするためだけに、大量の自動化されたコミットでログ ファイルを汚染します。

マーク: 通信をリポジトリの外に保存することを検討しましたが、それは解決できない別の問題につながります。これを解けば答えが得られます。問題は、pub リポジトリが、正確に対応するバージョンの Priv からビルドされたバイナリに依存するソフトウェアを保持していることです。そのため、Priv を保持しているサーバーに接続し、バイナリのリストを要求してダウンロードする「自動更新」機能が含まれています。重要なのは、このダウンロードを開始するための主要なパラメーターがバージョンであることです。

マーク: では、問題は、パブがどのバージョンをダウンロードするかをどのように知ることができるかということです? 現在、それは元の質問の状況によって解決されています。自動ビルド nant スクリプトは、Priv のバージョン番号を含めるように Pub のソース コードに変更をコミットしますが、それが「自動ビルドがバージョンを更新しました ..」で Pub ログを汚染するものです。自動更新ツールは、priv の場合にそのバージョンを使用して、Web サーバーから Priv バイナリを要求します。そして、それはすべて機能します。

マーク: 二次的な問題は、最初は関係を切り替えて、Pub のバージョン (Pub のバージョン) を使用して Pub ソフトウェアを自動更新し、Web サーバーが別のファイルを使用して最新のものを取得することで解決できるようです。 Priv バイナリの一致するバージョン。しかし、驚くべきことに、すべてのコミットから Pub ソフトウェアにバージョンを認識させる実用的な方法はないようです。

マーク: $Rev$ キーワードを自動更新コードに入れると、そのファイルが変更された場合にのみ更新されます。これは、Subversion での作業における「昔からの」課題のようです。pre-commit フックはソース コードをバージョンで更新できるようですが、誰かが問題の自動更新ソース ファイルをコミットする場合にのみ機能するようです。

マーク: あなたの最後のアイデアは少し混乱しましたが、追加の自動化されたコミットではなく、Pub へのコミットにバージョン情報を含めるというのは、先ほど述べたのと同じように思えます。私はそれが好きですが、理解できません(フォーラムや投稿を1日以上グーグルで読んだ後)。ファイルを個別にバージョン管理するだけなので、Subversion への通常のコミットと一緒にプロジェクト全体のバージョンをコミットする方法はよくある課題のようです。pre-commit フックで svnversion を使用しても、変更されたファイルのみが更新されますよね? では、自動ビルド ソース コードは、実行時にどのバージョンを認識するのでしょうか?

全員:質問と回答をありがとうございました。質問の理解を絞り込むのに役立ち、解決策にたどり着くことができます! SOはとてもクールです!

于 2009-11-08T15:56:04.590 に答える