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

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

ただいまの
回答率

88.03%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 12K+

score 13

コマンドプロンプトからバージョン管理ソフト「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のみチェックアウトする方法がありましたら、お教えください。
また、修正依頼で教えていただいたコードを実行しても同じ結果になりました。エラーは特にありません。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2015/12/20 11:01 編集

    文章を読む限り、何を聞きたいのかが明確でないと感じました。
    仮に、そのバッチを実行した場合に想定通り動作していないのだとしたら、「どうなって欲しい」「実際はこうなっている」というのを質門文章に含めたほうが良いかと思います。(加えて、エラーメッセージが出ているのであればそのメッセージも。)
    ///
    なお、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
    ではないかと。

    キャンセル

回答 2

checkベストアンサー

0

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

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

Subversionの各リビジョンは、それぞれのコミット内容をそのまま保持している訳ではありません。Subversionの特徴を列挙すると、

  1. ディレクトリとファイルを全く同等に扱う
  2. 前回のコミット内容との差分のみを保持する
  3. リビジョンによってソースツリーの断面を管理する

まず、図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/29 20:30

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

    キャンセル

0

> 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つ目のコマンドの-r33が対象リビジョンです。
最新の状態でなく、当時の(revision 3の)状態を取得したいのであれば、上記3ツメのコマンドのsvn up引数にも-r3を付与すれば良いです。
(PowerShellは今回初めて書いたので、実際には他にもっと良い書き方があるかもしれません)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/23 00:10

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

    キャンセル

  • 2015/12/23 02:41

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

    キャンセル

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る