質問: コマンドプロンプトからバージョン管理ソフト「TortoiseSVN」を使用して、 コミットログ上の指定したファイルを、作成した作業コピー用フォルダにチェックアウトするバッチを作成したいと考えています。 To yukihane さん ご指摘ありがとうございます。 やりたいことは、コミットログ上であるリビジョンの変更ファイルのみチェックアウトすることです。 例えば、コミットログのリビジョン1,2,3内容が以下だとします。 コミットログ revision1内容:branches,trunk,tags フォルダの追加 コミットログ revision2内容 ![コミットログ revision2内容](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/65d1fcb9ea8c7dfef4ef6d88dafaa56b.png) コミットログ revision3内容 ![コミットログ revision3内容](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/263bb2db967d391d0b2f92ebdbcb645c.png) このとき、以下コードのバッチファイルを実行し、リビジョン3ファイルのみチェックアウトしようとします。 mkdir work(チェックアウト先フォルダ名) cd work svn checkout -r 3(指定リビジョン) file:///D:/Tortoise-repo(指定URL) cd.. すると、以下のようにリビジョン3だけでなく、リビジョン2,1の内容もチェックアウトしてしまいます。 ![バッチファイル実行結果](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/aed834d736338a0ef89b1323fdb043e1.png) リビジョン3のみチェックアウトする方法がありましたら、お教えください。 また、修正依頼で教えていただいたコードを実行しても同じ結果になりました。エラーは特にありません。 よろしくお願い致します。
回答: * Subversion: Check out only those files affected during a specific commit - Stack Overflow に同じ質問がありますね。 これをmorinaoさんの例に当てはめると、 ``` > svn checkout --depth=empty file:///D:/Tortoise-repo work > cd work > svn log -q -v -r3 ``` これで所望のファイル名は取得できる、ということになります。 ただ、これはあくまでファイル名であって、ここから実際のファイルを取得しないといけないわけです。 Windowsのコマンドプロンプトから標準コマンドだけでこの処理を実行する方法が思いつかなかったので、PowerShellになってしまうのですが(画面キャプチャからはWindows8以降に見えますので大丈夫でしょう)、 ``` > svn log -q -v -r3|ConvertFrom-Csv -Delimiter " " -Header(1..5) | Select-Object "5" -Skip 3 | Where-Object {$_."5" -ne $null} | ForEach-Object { svn update $_."5".TrimStart("/") } ``` で特定リビジョン(今回の例では3)で変更のあったファイルのみを取得できます。 一連の操作をまとめて書くと(& エイリアスを使ってPowerShellをもう少し短くすると)以下のようになります。 ``` > svn co --depth=empty file:///D:/Tortoise-repo work > cd work > svn log -q -v -r3 | ConvertFrom-Csv -Delimiter " " -Header(1..5) | Select "5" -Skip 3 | ?{$_."5"} | ForEach { svn up $_."5".TrimStart("/") } ``` 1つめのコマンドの`work`がチェックアウトディレクトリ、3つ目のコマンドの`-r3`の`3`が対象リビジョンです。 最新の状態でなく、当時の(revision 3の)状態を取得したいのであれば、上記3ツメのコマンドの`svn up`引数にも`-r3`を付与すれば良いです。 (PowerShellは今回初めて書いたので、実際には他にもっと良い書き方があるかもしれません)