2009-10-04 14 views
14

ほとんどのプロジェクトでは、多くの共通コードが使用されています。私たちは(最終的に)私たちが共有コードを統一的に管理しているシステムに向かっています。私たちは共有コードをSVNの別のプロジェクトとして扱い、それを外部として参照します。しかし、私たちは、ライブラリーをある用途から別の用途へ移植することが避けられないことから、プロジェクトが開発中に外部ライブラリを開発ブランチまたはトランクに向ける傾向があります。開発ブランチで外部とSVNチェックアウトのタグ付け

結果として、リリースまたは内部マイルストーンのためにファイルにタグを付ける際に間違いが生じています。一度はすべての外部が最初にタグ付けされていることを確認せずにプロジェクトにタグを付けます。どうすればこの問題を解決できますか?私は間違いの可能性を減らす方法や、このようなちょっとしたタグを作った後に修復/修復する方法を探しています。理想的には、このソリューションはSVNに現在のポリシーを適用させる方法ですが、私はこのような問題の経験に興味があります。

答えて

11

私はその問題

  1. タグ付けを自動化に対処するための2つの戦略を使用します。プロジェクト上にタグを作成する前に、すべてのsvn:externalsを固定リビジョン/リリースタグに変更するシェルスクリプトを作成します。
  2. には、既存のタグの一貫性をチェックするスクリプトがあります。トランクにリンクされている外部のユーザであっても、タグ付け時に状態を再構築することは実際可能です。タグが作成された日時を知っているので、その時点でどのトランクリビジョンがアクティブであったかを知ることができます。特定のリビジョンのトランクを指す外部、またはタグが作成された時点の最新のリリースに移動します。また

、あなたはまた、タグが作成されているかどうかをチェックし、プリコミットフックを思い付くことができ、すべての外観は、固定されたリビジョンを指しているかどうか、そうでない場合コミット拒否する。

+0

これを行うためのスクリプトを作成する時間がある場合、オプション2を使用する方がよいソリューションです。これは私のプロジェクトのタグ付けにも使用するオプションです。オプション1では、外部リポジトリ(ルートプロジェクトのリビジョンではない)のリビジョン番号を知っておく必要があります。また、いくつかの異なるリポジトリから外部を引き出す場合は、さらに複雑になります。 – MOK9

1

これは本当のことだと思いますが、確かにできることはライブラリのリファレンス開発ブランチではありません。第三者の図書館であれば、そうしないだろうし、自分の図書館でもそうするのは良い考えではない。

参照ライブラリのバグに遭遇した場合は修正し、新しいリリースにタグを付け、プロジェクト内でその新しいタグを参照してください。

実際にライブラリの開発ブランチを参照する必要がある場合は、タグをいつ実行するかを決定し、すべての参照外部がタグ付きバージョンであることを確認する事前コミットフックスクリプトを使用できます。そうでない場合はコミットしてください。あなたがコミットするたびに取るのはかなりヒットです。

+0

もっとも良いことは、ライブラリの開発ブランチを参照しないことです。しかし、これは私の同僚の行動を制御することはできないし、間違いがないことを保証することができないため、私ができる実践的な変更ではない。 –

1

また、タグにコピーされた外見をフリーズするポリシーを適用したいが、まだサーバ上にそれを実装していない。

プリコミットフックは、svnlookコマンドをトランザクション番号とともに使用して、コピー内の「タグ/」宛先をチェックします。ヒットした場合は、プロパティを調べて、svn:externalsを検索する必要があります。おそらく、ポリシーの上書きを許可する他のプロパティ。

明らかな問題は、サーバーへの負荷と、そのフックに使用する言語です。通常、SVNにはPython Ctypesのバインディングが用意されていますが、残念ながら前回チェックした時点ではWindowsで使用できませんでした(このターゲットの場合はコンパイルできません)。しかし、pysvnモジュールはそれを実行するのに十分なだけかもしれません。この言語以外では、bashスクリプトはうまくいくかもしれませんが、扱いにくく、移植性がありません。または純粋なC ...

1

外部ライブラリと同じように内部ライブラリを扱うのではなく、 Apache Ivy(Maven)を使用している場合は、ライブラリを中央リポジトリ(バージョン番号1.0またはSNAPSHOT_20091005)に公開し、標準のIvy(Maven)メカニズムを使用してインポートするのは簡単です。

このようにして、SVN外部に関するすべての問題を取り除きます。もちろん、各プロジェクトはリリースを作成する前にタグを使用する必要がありますが、それは「リリース101」です。

+0

合意 - svnの外部は、価値があるよりももっと問題のようです。私がそれらが使われているのを見たところで、私たちはそれらなしではずっと良くなっていたでしょう。 – Peter

1

私はMartin v。Löwisに同意しましたが、あなたのsvn:externalsにリビジョン番号のみをハードコードすると、あなたの外部も独自のsvn:externalsを定義している場合に問題を尋ねています。

場合によっては、開発用のトランクの外部を指定のリビジョンに設定することは望ましくありません。これは開発用のreposをロックするためです。また、再帰的な外部を無視することはできません。最良の選択肢はすべての外部に再帰的にタグを付けることです。これは開発を継続することを可能にしますが、あなたはあらゆる目的のために独自のタグ/ブランチを形成します。

私はこれを行いますが、私はそれを投稿する前に少しそれをクリーンアップするスクリプトを持っている:)

+6

あなたはどこにでもこのスクリプトを投稿しましたか? –

3

Subversionクライアントのバージョン1.9は、それがここに望まれている正確に何をしますように見えますsvn copyため--pin-externalsオプションがあります。

この回答はfreenode IRCチャンネル#svndanielsh(Daniel Shahaf)に感謝します。

関連する問題