SVNの単一ファイルを特定のリビジョンに戻す


182

以前のバージョンに戻したいファイルがSVNリポジトリにあります。SVNでこれを行う方法は何ですか?リポジトリ全体ではなく、この特定のファイルのみを古いバージョンにダウングレードする必要があります。

ありがとう。

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

あなたが元に戻すと言ったとき、7年前の意味は何でしたかlol
Kalpesh Soni 2017

回答:


181

作業コピーに古いファイルが欲しいだけの場合:

svn up -r 147 myfile.py

ロールバックする場合は、「Subversionのコードを以前のバージョンに戻す方法?」を参照してください。


8
しかし、次に更新するときに、必要のないファイルが返されます...:S
andygoestohollywood '15 / 11/15

2
元に戻したくない場合は、svn commitでそのファイルをリポジトリに入れます
Packet Tracer

14
これはおそらく、質問者が望んでいたことを実際には実行しません。これを使用すると、作業コピーはクリーンで現状のままコミットできず、バージョン番号が指定されていない「svn update」は最新の不要なバージョンを取得します。
CXJ 2014

1
元に戻されたファイルをどのようにコミットできますか?
marcio 2016

2
CXJが言及するように、更新されたファイルをコミットする方法がないため、これは正しくありません。Mitch Dempseyが言うように、おそらく実行したいと思います(ただし、-forceでファイルを強制的に上書きすることに注意してください):svn export --force -r 147 myfile.py myfile.py
avejidah

76

svn catもリビジョン引数を取ります!

svn cat -r 175 mydir/myfile > mydir/myfile


20
これは、このページでの最良の回答です。変更されたファイルをコミット可能な状態のままにします。
dotancohen

これは、新しいファイルに貼り付けている場合は機能しないようです
ahnbizcad

それを振り返って、投稿したときに私が考えていたコンテキストをidk。思い出せない。それは無意味に思えます。
ahnbizcad

これは、変更を元に戻し、バージョン管理の専門知識がなくてもファイルをコミット前の状態に戻したい場合に、単純で簡単です。
匿名

57
svn revert filename 

これにより、単一のファイルが元に戻ります。


4
より長いコマンドで他のすべての答えはどうですか?ありがとう。
masterxilo 2014

どういたしまして。私は他の答えがどうなっているのか分かりません..笑
thestar

13
これはどのリビジョンに戻りますか?Docは、最新のリポジトリで置き換えるだけだと言っています。問題は、以前のバージョンに戻す方法です。
tgkprog 2014年

1
これは、最新バージョンのリポジトリに戻ります。質問の説明を読むと、彼はディレクトリ全体ではなく単一のファイルを元に戻す方法を探していたようです。
thestar 2014年

5
これはすべて、作業コピーを「元に戻す」ことによって破壊することだと思います。または、これまでにチェックアウトされたもの。svn update -r VER fileを実行して確認し、svn revertを実行します。
Gerard ONeill、2015

50

単一のファイルの場合、次のことができます。

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

あなたはそうすることができますsvn revert <file>が、それは最後の作業コピーを復元するだけです。


2
エクスポートし、ローカルコピーに貼り付けて、もう一度コミットしますか?
tgkprog 2013

1
それを行う1つの方法である@tgkprogはい、
ミッチデンプシー

@tgkprogと「好ましい」方法は何ですか?
hbogert 2014年

わからないが、それが私にとってうまくいったことだ:過去のリビジョンをエクスポートした。メモ帳で開き、コピーして、作業ファイルに貼り付けました。どのrevとその理由についてコメントすることを約束しました。UIツールはもっと良い方法があるかもしれません。
tgkprog 2014年

21

再び動作状態にレポを取得する方法:これまでのところ、ここですべての答えは、複雑さ(レポURIを見つける必要がある)、または、彼らは質問はおそらくを求め何をしていない、重大な欠点を持っているように見えるのそれ以前のバージョンでファイル

svn merge -r head:[revision-number-to-revert-to] [file-path]IMOは、これを行う最もクリーンでシンプルな方法です。削除されたファイルを元に戻すことは、この方法ではうまくいかないようです[1]。次の質問も参照してください:ファイルの以前のSVNリビジョンに戻すより良い方法?

[1]必要なものについてはsvn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up、「SVNから削除されたファイルを復元する正しい方法は何ですか?」も参照してください


少なくとも私のバージョンのSubversionでは、svn merge何らかの理由で複数のファイルを引数として取りません。この場合は、何もしないようです(エラーメッセージなし)。
Wrzlprmft

しかし、私のコマンドはファイルごとに繰り返すことでまだ機能しますよね?
ミシェルミュラー

はい、確かにそうです。
Wrzlprmft 2016年

1
これが最もクリーンであることに同意しました。
KevinG 2017

13

最善の方法は次のとおりです。

svn merge -c -RevisionToUndo ^/trunk

これにより、取り消したいファイルを元に戻すだけでなく、リビジョンのすべてのファイルが取り消されます。-リビジョンのプレフィックスとしてダッシュ()を忘れないでください。

svn revert File1 File2

ここで変更をコミットします。


9

あなたがしたい

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

これを行うと、ファイルのリビジョンがコミット可能な状態になります。ファイルをコミットします。


7

svn catコマンドでこれを行うのは簡単なので、リビジョンを指定する必要すらありません。

svn cat mydir/myfile > mydir/myfile

これはおそらく、タイムスタンプなどのiノード(メタデータ)データの役割を果たしません。


次に、ファイルをコミットしてリポジトリに移動します
tgkprog

3
これは更新よりもうまく機能しました。更新では、そのファイルに加えられた変更をコミットできないためです。(svn 1.8.3)
fe_lix_ 2013年

7

誰もこれに言及していないことに驚いた

リビジョン番号を確認せずにこれを書くことができます。元に戻したいものをコミットしただけの場合、他のファイルを変更し、ターゲットファイルが最後に変更されたファイルでない場合、これは機能しません。

svn merge -r HEAD:PREV file

コメントがある場合は、編集する前にここで話し合ってください。
Kalpesh Soni 2017

1
問題のシナリオでは、HEADからPREVに移行するために必要な変更を適用するように、最新の変更のリバースマージが必要ではありませんか?
Nick Russo

4
コマンドはsvn merge -r HEAD:PREV file、@ Nick Russoが言ったとおりである必要があります
Heinz

4

ファイルが数個しかなく、Tortoise SVNを使用している場合は、次の方法を使用できます。

  1. ソースファイルを右クリックし、[TortoiseSVN]-> [ログを表示]を選択します。
  2. ログのリビジョンを右クリックし、[リビジョンを保存...]を選択します。
  3. 古いリビジョンで現在のファイルを上書きします。
  4. 上書きされたソースファイルをコミットします。

これにより、file-xxxx(xxxxは古いリビジョン番号)などのバージョン管理されていない新しいファイルが保存されます。次に何をしますか?新しいリビジョン(HEADなど)を削除し、新しいファイルの名前を変更して、追加、コミットしますか?
ハインツ

いいえ、ファイル名にリビジョン番号を付けて保存しないでください。同じファイルの現在のバージョンとまったく同じファイル名で保存します(つまり、ファイル名にxxxxを含めません)。その後、通常のコミットを実行します。
Elling

4

コメントするのに十分な担当者がいないので、@ Mitch Dempsyの回答に追加します。

svn export -r <REV> svn://host/path/to/file/on/repos --force

--forceを追加すると、ローカルコピーがエクスポートで上書きされ、svn commitを実行してリポジトリにプッシュできます。


これが最良の答えです:)
Zgr3doo 2017

なぜこれが最良の答えですか?「svn way」で履歴を管理するものではありません
Jason S

2

単一ファイルの代替オプションは、ファイルの現在のバージョンを古いリビジョンで「置き換える」ことです。

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

これには、不要な変更がこのファイルのログ(つまり、svn log file.ext)に表示されないという機能が追加されています。


1

特定のリビジョンから個々のファイルをロールバックしてコミットできるようにするには、次のようにします。

svn merge -c-[OldRev#] [ファイル名]

すなわち。 svn merge -c -150 myfile.py

リビジョン番号のネガに注意してください


-1
sudo svn revert filename

これは、単一のファイルを元に戻すためのより良い方法です


2
sudoerパーミッションのあるプロダクションマシンに近づかないようにしてください。
David Lakatos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.