1

svn diff -summarize を使用して変更内容の概要を取得するコミット後のフックを作成しています。ファイル/フォルダーが追加または変更されると、常に自動的に更新される作業コピーでファイルの種類を取得できます。しかし、ファイルまたはフォルダーが削除されると、svn diff -summarize の項目がファイルまたはフォルダーであったかどうかを確認する方法がありません。

これに対して私が考えた回避策の 1 つは、自動的に更新される別の作業コピーを保持することですが、常に 1 つのリビジョンを他の作業コピーの背後に保持することです。そうすれば、ファイル/フォルダーが削除された場合、古い作業コピーでそれを取得できました。ただし、これは非常に非効率的な方法であり、2 つの異なる作業コピーを同時に保持する必要があると思います。SVN にこの作業に役立つものがあるかどうか疑問に思っていました。

4

1 に答える 1

2

任意のタイプの svn フックを作成するときに、リポジトリまたはトランザクションに関する情報が必要な場合はsvnlook、シェル スクリプトからプログラムを使用するか、選択した言語で svn API を使用します。svnlookスクリプトはサーバーのコンテキストで実行されるため、認証チェックのレイヤーを含むすべての svn RA (リモート アクセス) コードをバイパスするため、使用は高速です。これは問題ではありません。さらに、ファイルの種類の情報以外には使用していない作業コピーを更新するという追加のオーバーヘッドはありません。

svnlookリビジョン (post-* フックの場合) とトランザクション (pre-* トランザクションの場合) の両方を調査するための多数のオプションが含まれています。ここで特に興味深いのはchangedオプションです。

変更: 使用法: svnlook が REPOS_PATH を変更しました 変更されたパスを印刷します。 有効なオプション: -r [--revision] ARG : リビジョン番号 ARG を指定 -t [--transaction] ARG : トランザクション名 ARG を指定 --copy-info : コピーの詳細を表示

次のように、リビジョンまたはトランザクションを構成する変更が表示されます。

A   trunk/src/new-dir/
A   trunk/src/new-dir/newheader.h
A   trunk/src/new-dir/newsrc.c
U   trunk/src/existingsrc.c

ディレクトリを参照する場合、svnlook からの出力は常に / で終わります。これは、ファイルまたはディレクトリを検出するための簡単な識別器です。

ただし、削除を処理する場合、状況は少し複雑になります。ディレクトリが削除されると、そのディレクトリの下にあるものもすべて削除され、この情報は に表示されませんchanged。ここを参照してください:

D   trunk/src/new-dir/
U   trunk/src/existingsrc.c

あなたが見ているものの説明に基づいて、コミット後の何らかの形式のレポートを探していると推測します。もしそうなら、Subversion メーラーの post-* hookをチェックしてみてください。結果を電子メールで送信したくない場合でも、コードは、svn API を使用して変更のトランザクションまたはリビジョンをウォークスルーする方法を示しています。

于 2011-03-17T03:56:58.860 に答える