Subversionから1つのファイルをチェックアウトする


320

「1つのファイルをチェックアウトすることはできません。実行できるチェックアウトの最高レベルは、ディレクトリレベルです。」

Subversionを使用しているときにこの問題を回避するにはどうすればよいですか?

このフォルダはSubversionにあり、すべての画像が保存されています。その中の1つのファイル(画像)をチェックアウトしたいだけです。このフォルダは本当に大きく、私が今必要としない他のものがたくさんあります。


あなたはそれを他の方法で行うことができます。本番サーバーとsvn upコンピューターのローカルディレクトリにログインします。
Neocortex 14

回答:


403

簡単な答えはsvn export、ファイルをチェックアウトするのではなく、ファイルにすることです。

しかし、それはあなたが望むものではないかもしれません。不要なGBのジャンクをダウンロードせずに、ファイルを操作してチェックインすることができます。

Subversion 1.5以降を使用している場合は、疎チェックアウトを実行します。

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

古いバージョンのSVNの場合、次のようなメリットがあります。

  • 必要のないジャンクでいっぱいになっていなかった昔のリビジョンを使用して、ディレクトリをチェックアウトします。
  • 必要なファイルを更新して、混合リビジョンを作成します。これは、チェックアウトしたリビジョンにファイルが存在しない場合でも機能します。
  • 利益!

代わりの方法(たとえば、ディレクトリが作成されたリビジョンからのジャンク権が多すぎる場合)は、リポジトリの新しい場所に目的のファイルのURL-> URLコピーを実行することです(これは実際には作業ブランチです)ファイルの)。そのディレクトリをチェックアウトして、変更を加えます。

ターゲットの作業コピーなしに、変更したコピーを完全にリポジトリにマージできるかどうかはわかりません。もしそうならそれを行います。

そうでない場合は、残念ながら、ディレクトリ全体をチェックアウトしている人を見つけて、それを実行してもらう必要があります。または、変更を加えた時点で、残りの部分のダウンロードが完了している...


13
本当に簡単な解決策は、ウェブブラウザでリポジトリにアクセスすることです。
ドルメン

11
@dolmen-ファイルを変更する必要がないと想定します(そのリポジトリでWebインターフェイスが実行されていると想定しています)。私はコマンドラインSVNを使用しているのでsvn export、必要なファイルがわかっていれば、Webインターフェイスを使用するよりも使用する方が簡単です。質問者はすでにSVNを使用しているので、どのクライアントを使用するか、およびそのクライアントが使いやすくするかどうかによって異なりますsvn export。でもsvn ls、ブラウジングにはウェブインターフェースの方が優れていると思いますが、:-)
Steve Jessop、

2
SmartSVNクライアントは、Subversionサーバーがサポートしている場合、個々のファイルをロックします。また、バイナリ/実行可能ファイルをチェックインする前にチェックアウトを実行する必要があるフックがあります。2人のユーザーがバイナリを細かく変更し、それらの変更をマージすることは実際には意味がありません。これらは、この質問が行われたときに利用できなかった新機能である可能性があります。
TamusJRoyce、2011

@Tamus:「実際には意味がありません」と同意しましたが、私が説明するケースでは、マージは新しいバージョンを元の場所に戻すことです。マージのターゲットでバイナリファイルが変更されていることは想定されていません。したがって、ファイル自体は、古いバージョンを新しいバージョンに置き換える以外に「マージ」を必要としません。これは、SVNがそれを呼び出しているものであり、将来の参照のために変更がどこから来たかを記録します。そうです、その間ファイルをロックすることで競合回避を強制できます。
スティーブジェソップ2011

1
TortoiseSVNは個々のファイルをチェックアウトできます。それを実現するために、舞台裏でも同じことができると思います。
マイクスタロフ2013年

109

svn export代わりに試してくださいsvn checkout。これは単一のファイルで機能します。

制限の理由は、checkoutリポジトリ、リビジョン、属性などに関するメタ情報を含む作業用コピーを作成するためです。そのメタデータは「.svn」という名前のサブディレクトリに保存されます。また、単一のファイルにはサブディレクトリがありません。


2
警告:の非常に古いバージョンでsvnは、単一ファイルのエクスポートはできません。
MladenJablanović2011

5
これは、特定のスクリプトの最新バージョンをデプロイの一部として取得する場合などに優れた方法です。
william.berg 2013

2
その警告は2011年にまで一気に広まりましたが、非常に古いバージョンでも対応できますsvn cat $url_to_file_in_repo > $local_file_name
cprn

53

svn catまたはを使用しsvn exportます。

そのため、作業ディレクトリをフェッチする必要はありませんが、加えた変更をコミットすることはできません。変更を加えてコミットする必要がある場合は、作業ディレクトリが必要ですが、完全にフェッチする必要はありません。ディレクトリがまだ/ほとんど空のリビジョンをチェックアウトし、 'svn cat'を使用してHEADからファイルを抽出します。


svn cat svn://.../my_file.txtまさに私が探していたものでした。私はsvn://唯一の(いいえhttp://)リポジトリで作業しており、最新のwebsvnインターフェースでは生ファイルのダウンロードが提供されていないようです(または、構成が間違っているか、盲目です)。この方法は、ファイルをダウンロードするだけのcheckout+ より簡単upです。
ribamar

12

チェックアウトせずにリポジトリのreadme.txtを表示したい場合:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
これはREADMEファイルです。これを読んでください。

ヒント:作業コピーが古い(またはローカルで変更されている)場合、作業コピー内のファイルのHEADリビジョンを表示するには、パスを指定すると、svn catが自動的にHEADリビジョンをフェッチします。

$ cat foo.c
このファイルは私のローカル作業コピーにあり、私が加えた変更があります。

$ svn cat foo.c
リポジトリからの最新の最新リビジョン!

ソース


任意のHTTPクライアントを直接使用することもできます。お使いのWebブラウザ、またはのようなコマンドラインツールcurlwget
ドルメン

9

受け入れられた回答のTortoiseSVNと同等のソリューション(私は新しくSVNを採用しているので、これを社内の文書に書きました)は次のとおりです。ここでも共有すると便利だと思いました。

単一ファイルのチェックアウト:Subversionは単一ファイルのチェックアウトをサポートしていません。ディレクトリ構造のチェックアウトのみをサポートしています。(参照:http : //subversion.tigris.org/faq.html#single-file-checkout)。これは、作業コピーとしてチェックアウトされるすべてのディレクトリで、変更/ファイルリビジョンに関するメタデータが内部の隠しフォルダー(.svn / _svn)として保存されるためです。これは現在(v1.6)単一ファイルではサポートされていません。

代替の推奨戦略:チェックアウトディレクトリの部分を一度だけ実行する必要があります。その後、単一のファイルに直接アクセスしてチェックアウトできます。親フォルダーとディレクトリ構造の疎チェックアウトを実行します。スパースチェックアウトとは、基本的にはコンテンツファイルを生成せずにフォルダー構造のみをチェックアウトすることです。したがって、ディレクトリ構造のみをチェックアウトし、懸念事項であったすべてのファイルをチェックアウトする必要はありません。リファレンス:http : //tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

ステップ1:リポジトリブラウザーに進む

ステップ2:作業するすべてのファイルを含むリポジトリ内の親フォルダを右クリックし、[チェックアウト]を選択します。

手順3:新しいポップアップウィンドウで、チェックアウトディレクトリがローカルPCの正しい場所を指していることを確認します。「チェックアウトの深さ」というラベルの付いたドロップダウンメニューもあります。必要に応じて、「このアイテムのみ」または「フォルダを含む即時の子」を選択します。2番目のオプションは、ネストされたフォルダーで作業したい場合は、次に直接進むことができます。そうでない場合は、ネストされたフォルダーに対してこの手順全体を再度実行する必要があります。

ステップ4:親フォルダーがローカルで選択されたフォルダー内で使用可能になり、SVNで監視されます(隠しフォルダー「.svn」または「_svn」が表示されます)。リポジトリ内で、単独でチェックアウトする単一のファイルを右クリックし、[アイテムをリビジョンに更新]オプションを選択します。これで、単一のファイルを処理してリポジトリにチェックインできます。

これがお役に立てば幸いです。


8

次の2つの手順で実行できます。

  1. メタ情報のみを含む空のSVNリポジトリをチェックアウトします。

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. svn up指定したファイルを更新するために実行します。

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    

6

別のフォルダのチェックアウトにファイルを含めることで、本当に必要な場合の更新に対応できます。

SVN 1.6以降、ファイルを外部にできる、一種のsvnリンク。つまり、1つのファイルを含むバージョン付きの別のフォルダーを作成できます。このフォルダのチェックアウトでファイルへの変更をコミットすることも可能です。

非常に簡単です。ファイルを含めるフォルダーをチェックアウトし、フォルダーにプロパティを追加するだけです。

svn propedit svn:externals .

このような内容で:

file.txt /repos/path/to/file.txt

これをコミットした後、ファイルはフォルダーの今後のチェックアウトに表示されます。基本的には機能しますが、上記のリンク先のドキュメントで説明されているように、いくつかの制限があります。


4

repo-browserに移動してファイルを右クリックし、[名前を付けて保存]を使用します。ただし、TortoiseSVNを使用しています。


4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(filename.logを編集)

svn commit -m "this is a comment."

4

スティーブ・ジェソップの答えは私にはうまくいきませんでした。私はSVNのヘルプファイルを読みましたが、Photoshopを実行しているのでない限り、画像だけをもう一度チェックインしたくないので、バージョン管理されていないため、エクスポートはチェックアウトよりも優れたコマンドです(ただし、マイナーです)。

そして、--depth ARGはすべきではない、空が、ファイルが即時のディレクトリ内のファイルを取得します。したがって、フィールドだけでなくすべてのフィールドを取得しますが、空の場合はリポジトリから何も返されません

 svn co --depth files <source> <local dest>

または

svn export --depth files <source> <local dest>

他の答えについては、猫はあなたがすべてのもののイメージではなく、テキストだけに役立つコンテンツを読むことを可能にします。


1
ポイントは--depth empty、他のファイルはチェックアウトされるべきではないということでした。そうすれば、で単一のファイルを取得できますsvn up <source/file>。ではsvn export、これを行う必要はなく、ファイルを指定するだけです。
ケビンフェルメール

@reemrevnivek-あなたは正しいです。質問は単一のファイルを要求しただけですが、これは空であってもディレクトリ構造ファイル全体をチェックアウトしなくても機能します。
Vass

4

それを参照して、単一のファイルをエクスポートします。HTTPアクセスがある場合は、Webブラウザーを使用してファイルを見つけ、取得します。

編集後に元に戻す必要がある場合は、少し面倒かもしれませんが、svn import関数があると思います...


3

このようなことをしてください:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

基本的には、SVNからファイルを取得するディレクトリを作成するという考え方です。svn catコマンドを使用して、出力を同じ名前のファイルにリダイレクトします。デフォルトでは、猫はstdioに情報をダンプします。


2

リビジョン情報のないファイルが欲しいだけなら

svn export <URL>

2

Subversion 1.5では、サブディレクトリ(さまざまな--depthフラグ)をチェックアウトすることなく、ディレクトリの(すべての)ファイルをチェックアウトできます。あなたが要求したものではなく、「すべてより少ない」という形。


2

スパースチェックアウトテクニックを使用すると、既にチェックアウトされているか存在する特定のファイルを簡単なトリックでチェックアウトできます。

「このアイテムのみ」オプションを使用してリポジトリの最上位をチェックアウトした後、Windowsエクスプローラーで、まず更新する必要のあるファイルを右クリックする必要があります。コンテキストメニューで[リポジトリブラウザ]を選択します。リポジトリブラウザでそのファイルをもう一度見つけ、右クリックします。コンテキストメニューに[アイテムをリビジョンに更新]が表示されます。

それが文書化されていない機能なのか、それとも単なるバグなのかはわかりません。ようやくこのトリックを見つけるのに、仕事帰りの長い時間がかかりました。TortoiseSVN 1.6.2 を使用しています。


2

作業コピーの一部ではないディレクトリに単一のファイルをチェックアウトしたかったのです。

次のURLでファイルを取得してみましょう:http://subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

それで、ダミーディレクトリに移動したいターゲットファイルを含む指定されたディレクトリをチェックアウトしました(たとえばで終わるURLについてはetcbと言います/etc)。

次に、不要なターゲットディレクトリのすべてのファイルから.svn / entriesファイルを空にして、必要なファイルだけを残しました。この.svn / entriesファイルには、属性を持つ各ファイルのレコードがあるので、取得して保存するファイルに関するレコードだけを残します。

次に、「。svn」を新しい「作業コピー」となるディレクトリにコピーするだけです。それからあなたはただする必要があります:

cp .svn /directory
cd /directory
svn update myfile

これで、ディレクトリdirectoryはバージョン管理されます。単なる ''一時的な作業コピー ''であったディレクトリdirectorybを削除することを忘れないでください。


これはまばらなチェックアウトではありませんか?.svnディレクトリのファイルを手動でハッキングしてはいけません。
Lasse V. Karlsen、2012

おそらくそれは問題を適切に解決しました。それはバージョン管理が機能する方法であり、ディレクトリの拡張子としてファイルを処理することもできると思います。試してみて、ロジックのどこが悪いのか教えてください。この機能でsvnユーティリティを拡張することをsubversion開発チームに提案すると、このスレッドに回答したすべての人の問題が解決されます。
hendergassler

2

他の答えはどれもうまくいかなかったので、このハックを使用してそれを行いました:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

これにより、リモートパスからのファイルのみを含む新しいローカルフォルダが作成されます。次に、ここに置きたいファイルへのシンボリックリンクを作成できます。


OPはsvn co、ディレクトリ全体がイメージファイルでいっぱいにならないように、1つのファイルについて質問しました。また、シンボリックリンクを追加しても複雑さが増すだけで、一時ディレクトリからの移動は機能しますが、画像のディレクトリ全体を1つの画像でチェックアウトする必要があります。@ steve-jessopは正しい考えを持っていました
Chris Marotta

2
OPのChrisMarottaが9年前に質問した。ここで誰もOPに答えていません。これはこの種の問題の一般的なトピックであり、元のOPとは何の関係もありません。人々は自分の問題の解決策を見つけるためにここに来ています。そして、彼らがそれを読んだとき、彼らのうちの何人かは、これが唯一の適切な解決策であった私の状況になるでしょう。それが私がそれを投稿した理由です。
Lacho Tomov 2017

1
私はこの答えに満足しています。それが助けになりました
Leos Literak

1

この問題は以下によってカバーされます:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

svnから1つのファイルをチェックアウトし、変更を加えて、変更をリポジトリにコミットできるスクリプトが添付されていますが、「svn up」を実行して残りのディレクトリをチェックアウトすることはできません。svn-1.3、1.4、1.6でテストされています。


1

ファイルをエクスポートするだけで、後で更新する必要がない場合は、SVNコマンドを使用せずに実行できます。

TortoiseSVNリポジトリブラウザーを使用して、ファイルを選択し、右クリックして、[ URLをクリップボードにコピー ]を選択します。そのURLをブラウザーに貼り付けます。ログインすると、ファイルのダウンロードを求めるプロンプトが表示されます。

このようにして、目的のリビジョンを選択し、古いバージョンのファイルをダウンロードすることもできます。

これは、SVNサーバーにWebインターフェイスがある場合に有効であることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.