Subversion では、特定のリビジョン番号がわかっている場合、特定のコミット中に影響を受けたファイルのみをチェックアウトできますか?
13 に答える
Subversion のチェックアウトでは、個々のファイルではなく、特定のフォルダーのみをチェックアウトできると思います。とはいえ、コマンドは次のとおりです。
svn log -r *revision* -q -v
指定されたリビジョンに関連付けられた変更が一覧表示されるため、このコマンドの出力を処理して、完全なディレクトリの作業フォルダーをチェックアウトした後、目的のファイルをどこかにコピーできます。
次のような特定のリビジョン以降に変更されたファイルのリストを取得できます。
svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt
次に、fileschanged.txt 内の各ファイルをチェックアウトするスクリプトを作成します。
少し話題から外れていることはわかっていますが、TRACを使用してこれを行い、2つのリビジョン間で変更されたファイルのみを元のディレクトリ構造のファイルを含むzipアーカイブとしてエクスポートします。
ここで「チェックアウト」という用語を CVS の意味、つまり「svn 更新」で使用している可能性があると思います。そうですか?
その場合は、必要な特定のリビジョンに更新できます。
svn update -r12345
またはそのリビジョンのそれらのファイルだけでも:
svn update -r12345 file1 file2 file3
ただし、他の提案のいくつかを使用して、svn からファイルのリストを取得する必要があります。
最近のバージョンのsvnを使用している場合は、空のフォルダーをチェックアウトしてから、特定のファイルを更新できます。
選択するファイルのリストを取得した後、
svn co --depth=empty url dest
cd dest
svn up file1 file2 file3
編集:ここで受け入れられた答えとほぼ同じ解決策:Subversionから1つのファイルをチェックアウトする
svn checkout
ファイル レベルではなく、ディレクトリ レベルでのみ機能します。もちろん、特定の変更セットのすべての変更が同じディレクトリからのものである場合は、svn checkout <url> <path> -r<revid>
.
を使用して、影響を受けるファイルのリストを確認できますsvn log -q -v -r123 url
。
本当に影響を受けるファイルだけを取得したい場合はsvn cat urlToFile -r123 > myfile
、各ファイルに使用できます。
ここにそれを行う1つの方法があります。
svn co --depth empty svn://myrepository/mytrunk
cdマイトランク
svn diff -c[REVNUM] svn://myrepository/mytrunk | grep "インデックス:" | awk '{print $2}' | xargs -n 1 svn update --parents
awk ワンライナーからの出力は、相対パスで変更されたファイルのリストです。前述のように、更新は個々のファイルに対して機能し、チェックアウトはモジュールに対して機能します。「--parents」オプションは、必要に応じて作業コピーにディレクトリを強制的に作成します。
update には「--changelist」オプションもありますが (少なくとも v.1.7.1+ では)、私が望んでいたことをしているようには見えませんでした。
これは単純な bash スクリプト バージョンです。不要な行を削除するために「検索パターン」を使用しました。リビジョン、リポジトリ アドレス、および宛先パスは引数として指定されますが、ハードコーディングすることもできます。
#!/bin/bash
REVISION=${1}
REPOSITORY="${2}"
DEST_PATH="${3}"
SEARCH_PATTERN="trunk"
FILES=$(svn log -q -v $REPOSITORY -r $REVISION | grep $SEARCH_PATTERN)
mkdir -p $DEST_PATH
for FILE in $FILES ; do
if [[ $FILE == *"$SEARCH_PATTERN"* ]]
then
FOLDER=$(dirname $FILE)
mkdir -p $DEST_PATH/$FOLDER
svn export -r $REVISION $REPOSITORY/$FILE $DEST_PATH/$FOLDER
fi
done
#EOF
長い間死んでいた質問を復活させて申し訳ありませんが、満足のいく回答は得られませんでした。
SVNKit を使用して、これを行うための簡単なツールを作成できます。それについてこのブログを見つけ、必要に応じてコードをわずかに変更しました。展開プロセスで今日まで使用しています。
チェックアウトではなくエクスポートを行いますが、それは簡単な変更になると確信しています。
svn mergeinfo --show-revs 対象http://base.com.rev1 http://base.com.rev2
これにより、多くの改訂が行われます
ここで、各リビジョンのファイルのリストを表示したいと考えています。リビジョンのリストをメモ帳または editplus にコピーして、1 行に収まるように変更します。
svn ログ -r r33521 -r33762 -3456 -r5623 -q -v >> MissFiles.txt
注 : 118 個のリビジョンがあり、ファイルのリストを正しく取得できませんでした。だから私はリビジョンのサブセットに分割して上記のコマンドを実行しました
を使用して、特定の変更のファイルのリストのみを取得できます
svn log -v -q -r rev
次に、次のようなパイプを使用して、ラインの前面にあるマーカーをクリーンアップできます
sed -e "s/^ . / /" | egrep -v "Changed paths:|-----"
. ファイルだけを取得するには、おそらくsvn cat
ニコライの提案に従って使用します。
[sed パイプラインをクリーンアップして簡素化するために編集されました。]