1

SVN制御下のPHPプロジェクト(VisualSVN)があります。

どういうわけか、現在のリビジョン番号でリポジトリ内のファイルを更新する必要があります。メインサイトが更新/チェックアウトされたときにsvnビルド番号を表示できるようにします(この部分は問題ではありません)。

pre / post-commit-hookでこれを行うことは可能ですか?

4

4 に答える 4

2

事前コミットフックではなく、ビルドソリューションが必要なようです。Apache Antのようなビルドシステムを使用すると、ライブ環境向けのソリューションを準備するときに、リポジトリから最新のリビジョン番号を取得できます。

編集:実際にあなたの質問に答えるために「これを行うためにpre / post-commit-hookで可能ですか?」はい、それは技術的に可能ですが、すでに示唆されているように、それは避けるべきです。

于 2012-05-29T03:12:07.743 に答える
2

pre-commit-hooksとpost-commit-hooksの動作は異なります(フック、特にフックの実装に関する部分については、 SVNレッドブックのドキュメントを参照してください)。

  • pre-commit:コミットが許可されているかどうかを確認します。したがって、pre-commitフックは、commit内で何も変更できません。
  • post-commit:コミットが成功したことを通知します。

したがって、何かを変更する機会については言及されていません。代わりに、「フックの実装」のセクションに段落があります。

フックスクリプトはほとんど何でも実行できますが、フックスクリプトの作成者が抑制を示す必要がある1つの側面があります。それは、フックスクリプトを使用してコミットトランザクションを変更しないことです。フックスクリプトを使用して、コミットされているファイルに存在するエラー、欠点、またはポリシー違反を自動的に修正したくなるかもしれませんが、そうすると問題が発生する可能性があります。Subversionは、リポジトリデータの特定のビットのクライアント側キャッシュを保持します。この方法でコミットトランザクションを変更すると、それらのキャッシュは検出できないほど古くなります。この不整合は、驚くべき予期しない動作につながる可能性があります。トランザクションを変更する代わりに、pre-commitフックでトランザクションを検証し、必要な要件を満たしていない場合はコミットを拒否する必要があります。ボーナスとして、ユーザーは注意深く、

ですから、そうすることは不可能であるか、少なくとも推奨されていると思います。

于 2012-03-28T06:25:15.133 に答える
0

mliebeltは正しいテキストを引用しましたが、彼は悪い結論を出しました。2回でも:

  • コミット後のフックで行う必要があります
  • フックで行うことは不可能です

2番目のステートメント

コミット後のフックがこのコミットに含まれていないファイルを書き換える場合、それは完全に有効な操作であり、何も壊れませんでした。

最初のステートメント

このソリューションは、多くの理由で明らかに悪いです。

  • リポジトリに(後で参照するために)データを含めます。これは、リポジトリ全体のデータ変更に依存しますが、このファイル内のデータを変更するたびに、リポジトリデータの状態も変更されます。古典的な悪循環
  • 必要なリビジョンの量を2回増やします。各「データリビジョン」の後に「トラッキングリビジョン」を実行する必要があります
  • このデータを持っているVCSで十分であるため、VCSが他の問題に関与し、ビルド展開ツールにより適していることを望んでいます。

リポジトリ(またはの作業コピー)自体には、最後のリビジョンに関する情報(svn info、、)があり、データ内に保存すると、OccamのRarozに違反しますsvnversionsvn log -r HEAD外部リポジトリを使用するためにデータを「公開」する場合、データを抽出するだけです。

どのツールと使用方法は、ワークフローの展開、OS(通常のWin-boxではgawk-grep-sedされていない)、いくつかのヒントに大きく依存しています。

  • TortoiseSVNのSubWCRev(Winのみ)は、特別なSubWCRevのキーワードを実際の値に置き換えることで、作業コピーを検査し、テンプレートファイルを処理できます。SubWCRevには、Linuxの世界向けの姉妹プロジェクトがあります。これらのツールの使用は、テンプレートファイルをどこかに(リポジトリの内部または外部に)保存し、処理された結果をプロジェクトツリーを使用するために準備された内部に保存することを前提としています。
  • svnversionとsvnlookは、どのOSでも使用できます(それに応じてWC-pathとrepository-pathに)

そしてついに

  • Subversionキーワードを使用して、リポジトリ内にリビジョン番号を保存できます。ファイル内で使用される$ Revision $は、このファイルの最後の変更のリビジョンを反映し、拡張後に事前定義された形式を持っていることを忘れないでください
于 2012-03-28T10:04:15.957 に答える
0

開発者にファイルを自分で更新するように要求し、pre-commitスクリプトを使用して、更新が正しくない場合にコミットを拒否するのはどうですか?おそらく、リビジョン番号の挿入は、エディターまたはビルドプロセス/デプロイスクリプトにより適切に組み込まれる責任です。

于 2012-03-28T11:50:24.137 に答える