0

変更されていないファイルをチェックアウトせずに、リビジョンまたはリビジョンの範囲で変更されたSVNリポジトリからのファイルのみをチェックアウトすることは可能ですか?

4

8 に答える 8

2

すべてではなく、変更されたファイルだけを取得する直接的な方法があります。

私の考えは次のとおりです: リストの詳細な出力 (最後に変更されたバージョンを示します) を使用し、それを awk でフィルタリングし、残りをチェックアウトします。たとえば、バージョン 42 で変更されたファイルを検索するには、これを使用します

VERSION=42
svn list -v -R -r $VERSION svn://... |  awk "/^[ ]*$VERSION/ {print \$7}" > files_to_checkout

そして後で実行しますsvn update -r $VERSION 'cat files_to_checkout'(またはコマンドを実行する場所に応じて、URL で co)。

編集: 追加のさらに短い: svn diff コマンドを使用し、-x と --diff-cmd で diff コマンドを svn co に置き換えます。これには引数シフトのハッキングが必要ですが (ここでは詳しく説明しません)、必要なのは 1 行だけで、中間ファイルは必要ありません (上記で保存することもできますが、読みやすさが犠牲になります)。

于 2008-11-26T14:07:07.753 に答える
2

私の提案は、フローロが提案するのと同じ行にあります。ただし、範囲が必要です。次のシェル関数を実行できます。

function checkout_files_in_revrange()
{
  svn_url=$1;
  start_rev=$2;
  end_rev=$3;
  for theCheckoutCanditate in `svn log -r $start_rev:$end_rev --verbose --incremental | grep "   M " | cut -f5 -d' ' | cut -f3- -d/`
  do
     svn co $svn_url/$theCheckoutCandidate -q;
  done
}
于 2008-11-26T14:17:09.573 に答える
1

-v (verbose オプション) を指定して svn log を使用する場合:

svn log -r <revision> -v <path>

変更されたファイルを含む出力が得られます。

 r3 | ciaran | 2008-11-16 12:24:30 +0000 (Sun, 16 Nov 2008) | 1 line
Changed paths:
   A /trunk/apache/apache.conf
   A /trunk/application/controllers

Commit message goes here

これを grep などで操作して、svn co コマンドのシーケンスを生成できるはずです。

于 2008-11-26T14:02:05.377 に答える
1

これは MSBuild スクリプトで行います。

ステップ 1: - diff コマンドを使用して変更されたファイルのリストを取得し、出力をターゲット ディレクトリの一時ファイルにリダイレクトします ステップ 2: - 一時ファイルを itemGroup に読み取ります

<Exec command="$(svnExecutable) diff -r $(StartRevision):$(EndRevision) $(DOUBLE_QUOTES)$(SvnRepositoryPath)/$(DOUBLE_QUOTES) --no-diff-deleted --summarize &gt; $(TempFilePath)" WorkingDirectory="$(WorkDirectory)" />

于 2008-11-26T14:38:38.593 に答える
0

これが可能かどうかは完全にはわかりませんが、次のようなこともできます。

svn checkout --revision <revisionNumber> 

特定のリビジョンを取得し、

svn log --revision <revisionNumber> 

リビジョンでチャンドされたすべてのファイルを一覧表示するには

于 2008-11-26T13:35:20.327 に答える
0

あなたの質問に答える別の方法:

既存の作業コピーがあると仮定すると、見ているファイルを含むディレクトリのルートで「svn update」を使用するだけで、現在のリビジョンと HEAD リビジョンの間で変更されたものを最小限のデータで正確に取得できます。

CVS や VSS などの古いソースコード管理システムは、このファイルが変更されたすべてのファイルについてサーバーに要求しましたか? 、subversion はツリーの変更を単一のアクションとして送信するだけです。ファイルのリストを svn update に渡すと、この利点はありません。

したがって、変更内容を転送する最も効率的な方法は、単に更新することです。これは、作業コピーの基本バージョンと比較した HEAD の変更のバイナリ差分のみを転送します。


あなたが解決しようとしている問題がsvn updateが遅すぎることである場合、私たちは Subversion 1.7 でそれを解決しようとしています。

このバージョンでは、作業コピー全体をロックする必要がある単純な操作 (更新など) を大幅に高速化する、新しい作業コピー データ ストレージ フォーマットが導入されます。

于 2008-11-26T15:14:23.623 に答える
0

svn diff -r starting_revision:ending_revision_or_HEAD --summarize

于 2012-07-05T23:25:14.457 に答える
0

ほとんどの人が提案したのとほぼ同じ行で (ただし、grep と awk を使用するシステムでのみ)、次のコマンドを実行してリストを取得できます。

svn log -v --revision <revision_number> | grep "^ " | awk '{print $2}'.

于 2009-01-20T09:18:52.360 に答える