質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

TortoiseSVN

TortoiseSVNは、フリーのSubversion(SVN)クライアントです。 Windowsのシェルエクステンションとしての機能を果たします。 Subversionのコマンドを実行せずに使用が可能です。

Q&A

解決済

2回答

17097閲覧

Tortoise SVN 指定リビジョンファイル チェックアウト 自動化

morinao

総合スコア13

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

TortoiseSVN

TortoiseSVNは、フリーのSubversion(SVN)クライアントです。 Windowsのシェルエクステンションとしての機能を果たします。 Subversionのコマンドを実行せずに使用が可能です。

1グッド

1クリップ

投稿2015/12/19 14:14

編集2015/12/20 10:36

コマンドプロンプトからバージョン管理ソフト「TortoiseSVN」を使用して、
コミットログ上の指定したファイルを、作成した作業コピー用フォルダにチェックアウトするバッチを作成したいと考えています。

To yukihane さん
ご指摘ありがとうございます。
やりたいことは、コミットログ上であるリビジョンの変更ファイルのみチェックアウトすることです。

例えば、コミットログのリビジョン1,2,3内容が以下だとします。

コミットログ revision1内容:branches,trunk,tags フォルダの追加

コミットログ revision2内容
コミットログ revision2内容
コミットログ revision3内容
コミットログ revision3内容

このとき、以下コードのバッチファイルを実行し、リビジョン3ファイルのみチェックアウトしようとします。

mkdir work(チェックアウト先フォルダ名)
cd work
svn checkout -r 3(指定リビジョン) file:///D:/Tortoise-repo(指定URL)
cd..

すると、以下のようにリビジョン3だけでなく、リビジョン2,1の内容もチェックアウトしてしまいます。
バッチファイル実行結果

リビジョン3のみチェックアウトする方法がありましたら、お教えください。
また、修正依頼で教えていただいたコードを実行しても同じ結果になりました。エラーは特にありません。

よろしくお願い致します。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/20 02:05 編集

文章を読む限り、何を聞きたいのかが明確でないと感じました。 仮に、そのバッチを実行した場合に想定通り動作していないのだとしたら、「どうなって欲しい」「実際はこうなっている」というのを質門文章に含めたほうが良いかと思います。(加えて、エラーメッセージが出ているのであればそのメッセージも。) /// なお、svn checkoutコマンドの解説は http://www.caldron.jp/~nabetaro/svn/svnbook-1.7/html-chunk/svn.ref.svn.c.checkout.html にありまして、ここを読むとわかりますが、おそらくやりたいことは svn checkout file:///D:/Tortoise-repo@3 work ではないかと。
guest

回答2

0

ベストアンサー

残念ながら、morinaoさんがやりたいこと(ファイルを単独でチェックアウトする)は、Subversionの仕様上、物理的に不可能です。というのは、Subversionの「リビジョン」という概念が、おそらくmorinaoさんの想像されているものと異なるからです。

まずは、下記の図をご覧ください。
SVNのリビジョン

Subversionの各リビジョンは、それぞれのコミット内容をそのまま保持している訳ではありません。Subversionの特徴を列挙すると、
0. ディレクトリとファイルを全く同等に扱う
0. 前回のコミット内容との差分のみを保持する
0. リビジョンによってソースツリーの断面を管理する

まず、図1をご覧ください。file1リビジョン2で初回コミットされ、修正版がリビジョン4でコミットされています。仮に、リビジョン2では

aaa bbb

という内容でコミットされ、リビジョン4では1行追加されて

aaa bbb ccc ←追加された行

がコミットされたとします。
この時、リビジョン4では、実際にはリビジョン3との差分である

ccc

という情報だけがコミットされます。
ですから、もし特定のリビジョンでコミットされた情報だけを個別に取り出せるのだとすれば、リビジョン4をチェックアウトするとfile1の内容は不完全なものになってしまいます。

しかし、Subversionでリビジョン3と指定すると、実際には図2のように各ディレクトリ/ファイルの直近のリビジョンのディレクトリ/ファイルを指定したことになります。

ここでちょっと、Subversionがこのような仕様になっている理由に注目して頂きたいのですが、ソフトウェアの開発でソースコードのバージョン管理をする目的は何でしょうか!?

今や、一つのファイルで完結するソフトウェアというものは殆どありません。アプリやサービスの機能が高度になるほど、たくさんのファイルで構成されているはずです。ですから、過去のある時点で、そのソフトウェアの構成要素がどんな状態であったのかを知りたい場合、特定のファイルだけではなくてソースツリー全体としてどんな状態にあったのかを簡単に再現できなければなりません。さもなければ、当時と全く同じ条件でビルドすることも出来ません。

ですから、ソフトウェア開発に際してソースのバージョン管理をする上で最も重要なのは、個々のファイルのバージョンを管理することではなく、特定の時点のソース断面を簡単・確実に再現出来ることです。

そして、Subversionの最も優れている点は、このソース断面リビジョン番号というたった一つの数値で管理出来ることなのです!

チェックアウトという行為は、ソースツリーに変更を加えるために作業コピーを作成するためのものであり、Subversionのリポジトリとの同期状態(=差分の有無)を確認しつつ開発作業を進めるためのものなので、ファイル単独でチェックアウトするということはあり得ません。
ちなみに、作業コピー(=Working Copy)というディレクトリツリーのトップディレクトリには、.svnという管理用の隠しディレクトリがあり、その内部で作業コピーの状態を示す各種のメタデータを保持しています。

もし下記のように、特定のリビジョンのファイルをチェックアウトしようとすると、

C:\>svn checkout file:///path/to/file@3 file svn: E200007: URL 'file:///path/to/file' refers to a file, not a directory C:\>

のようなエラーが発生します。つまり、チェックアウト可能なのはディレクトリのみということです。

特定のリビジョンのファイルを単独で取得したい場合は、チェックアウトではなくエクスポートします。

C:\>svn export file:///path/to/file@3 file

ただし、この場合はその時点のファイルを取り出すだけで、修正内容をコミットすることは出来ません。

ですから、特定のファイル(あるいはファイル群)を個別にチェックアウトしたい場合は、予めディレクトリを分けてコミットしておく必要があります。

もちろん、予め対象のディレクトリツリーをチェックアウトして作業コピーを作成しておけば、yukihaneさんの回答にあるような仕方で、特定のリビジョンでコミットしたファイルのパスを取得し、そのファイルを作業コピー上で個別に最新化ことは出来ます。
しかし、対象ファイルが修正されてリビジョン4が最新であった場合、リビジョン3を指定してupdateしていないので、作業コピー上の対象ファイルはリビジョン4の内容になってしまいます。ですから、リビジョン3のファイルを取得する、という目的からすると、update時に明示的にリビジョンを指定する必要があります。

投稿2015/12/21 22:01

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morinao

2015/12/29 11:30

pi-chanさん 丁寧なご回答ありがとうございます。 説明を読み、私がしたかったことはexportだと思いました。 参考になりました。
guest

0

に同じ質問がありますね。
これをmorinaoさんの例に当てはめると、

> svn checkout --depth=empty file:///D:/Tortoise-repo work > cd work > svn log -q -v -r3

これで所望のファイル名は取得できる、ということになります。

ただ、これはあくまでファイル名であって、ここから実際のファイルを取得しないといけないわけです。
Windowsのコマンドプロンプトから標準コマンドだけでこの処理を実行する方法が思いつかなかったので、PowerShellになってしまうのですが(画面キャプチャからはWindows8以降に見えますので大丈夫でしょう)、

PowerShell

1> 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をもう少し短くすると)以下のようになります。

PowerShell

1> svn co --depth=empty file:///D:/Tortoise-repo work 2> cd work 3> svn log -q -v -r3 | ConvertFrom-Csv -Delimiter " " -Header(1..5) | Select "5" -Skip 3 | ?{$_."5"} | ForEach { svn up $_."5".TrimStart("/") }

1つめのコマンドのworkがチェックアウトディレクトリ、3つ目のコマンドの-r33が対象リビジョンです。
最新の状態でなく、当時の(revision 3の)状態を取得したいのであれば、上記3ツメのコマンドのsvn up引数にも-r3を付与すれば良いです。
(PowerShellは今回初めて書いたので、実際には他にもっと良い書き方があるかもしれません)

投稿2015/12/20 13:56

編集2015/12/20 14:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morinao

2015/12/22 15:10

yukihaneさん ご回答ありがとうございます。 コマンドプロンプトで実行するのは難しいのですね。 参考にさせて頂きます。
退会済みユーザー

退会済みユーザー

2015/12/22 17:41

コマンドプロンプトからPowerShellを呼び出すこともできる(らしい)ので、そこはあまり問題にならないと思うのですがいかがでしょう? http://news.mynavi.jp/column/powershell/013/ また、PowerShellでなくとも、vbsやjscript、別途インストールしても良いならruby,pythonなど特にPowerShellである必要もありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問