SVNチェックアウトのローカル変更を破棄する方法は?


197

オープンソースプロジェクトのレビュー用に差分を提出したかったのです。

(ターミナル、Ubuntuから)SVNを使用してコードを取得しました。そして、いくつかのファイルでマイナーな編集を行いました。提出したい変更は1つだけです。私が行った残りの変更はデバッグ用で、もはや必要ありません。

私は使用して差分を生成しました svn di > ~/os/firstdiff.diff

だから私の質問、私のローカル変更を破棄する方法は?

それを行うSVNの方法はありますか?そうでない場合は、各ファイルに移動してすべての編集内容を削除する必要があります。次に、新しいdiffを生成して送信します。

回答:


253

svn revertたとえば、次のコマンドを使用します。

svn revert some_file.php

これは(他のすべてのsvnコマンドと同様に)svnbookリソースまたはマニュアルページに、またはコマンドとともに詳細に文書化されていますsvn help


2
Vinayakが自分の面白くない変更を自分のために保持したいと思うかもしれないことを除いて。
Basile Starynkevitch、2012

2
@BasileStarynkevitch:もう一度質問を読みましたが、他の変更は必要ないようです: "" "変更の残りは基本的にデバッグ用であり、もはや必要ありません。" "" :)
セドリックジュリアン

1
はい...しかし、彼は自分のためにそれらをさらに維持したいと思うかもしれません...(彼の質問は両方の方法で理解されるかもしれません)。
Basile Starynkevitch、2012

193

svn revertコマンドを使用して、すべての変更を元に戻す必要があります。

  • 変更をファイルに戻す: svn revert foo.c
  • ファイルのディレクトリ全体を元に戻す: svn revert --recursive .

1
svn 1.1への参照は、それがgoogleによって与えられた最初のリンクであるという事実にもかかわらず少し古いです;)
セドリックジュリアン

ファイル名の一部の文字は無視される可能性があります。たとえば、icon @ 2x.pngです。svn revert icon@2x.png。svnはSkipped 'Icon'と言います。
topwik 2013年

1
これが最良の答えです。チェックする必要があります。
rickfoosusa 2014

12
svn revert --recursive .私に助けをたくさん
Paul Vargas

これは、--recursiveパラメータがローカルの変更を元に戻し、これが問題であるため、受け入れられた回答である必要があります。
arueckauer

15

特定の1つのファイルのローカル変更を破棄するには:

$ svn revert example_directory/example_file.txt

特定の1つのフォルダー内のローカルの変更を破棄するには:

$ svn revert -R example_directory/

7

svn revert元のポスターにはシンプルで十分でした。ただし、単純な方法でsvn revertは、より一般的なケースでは機能しません。

  1. 両方とも共有したいというの編集と持っているあなたが共有したくないされている編集同じファイルを
  2. あなた自身の私的利益のために維持することにまだ興味があるローカルな変更があります

@ErichBSchulzの使用に関する提案git add -pは非常に合理的であり、そのような場合にはより一般的に適用できます。答えは詳細に欠けていました。現在のディレクトリが共有可能なパッチを作成したいディレクトリであるとすると、次のようなことができます:

  1. 元のバージョンをsubversionから別のディレクトリにチェックアウトします(ここではsubdirectoryを使用して、存在しないディレクトリ名を選択しますTMP/)。

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. その初期のsvnチェックアウトを基礎として使用し、gitリポジトリを初期化して、.svnディレクトリを無視します。svn headのすべてを一時的なgitリポジトリにコミットします

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. 新しく準備したgitリポジトリのメタデータを元の作業ディレクトリにコピーします。Pristine Subversionチェックアウトディレクトリは不要なので、削除できます。作業ディレクトリはgitとsubversionリポジトリの両方になりました。

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. 強力で便利な方法を使用git add -pして、共有するものをインタラクティブに正確に選択し、それらをgitリポジトリにコミットできます。コミットにファイルを追加する必要がある場合は、git add <file-to-add>前に行うgit commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. コミットを使用して、共有するパッチを準備します。この目的でgit diff HEAD^..HEAD、またはを使用することもできますgit format-patch(後者は、パッチまたは複数のパッチを含む送信メールを直接準備するために使用できます)。

    $ git show -p HEAD > my-mighty-patch.patch
    

gitメタデータを削除するには、次のようにしますrm -rf .git/。元の作業ディレクトリを引き続きハッキングする場合は、を使用gitしてローカルの変更を管理できます。この場合、あなたはおそらく使い方を学ぶことの投資から利益を得るでしょうgit svn

注:これに精通している場合gitは、即興で行うのはかなり簡単です。そうでなければ、これは多分少し乱雑に見えます。これらの手順からスクリプトを記述して、gitを理解せずに使用できるsvnの「インタラクティブコミット」または「インタラクティブパッチの作成」を実装することで、アプローチを一般化できます。


3
説明なしの匿名-1をありがとうございます。とにかく、このアプローチが意味をなすときを明確にして、答えを改善するために時間をかけました。
FooF、2015年

2
拡大してくれてありがとう。私からの+1!心配しないで。タフな群衆。
ErichBSchulz、2015

1
親指をありがとう、@ ErichBSchulz!ゆっくりと私たちは世界を敵対者にもかかわらずより住みやすい場所にしています!!! ;-)
FooF 2015年

4

あなたは使うことができます

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

差分を公開するときは、差分の対象となるリビジョンを伝えることを忘れないでください。

他の人が答えたように、svn revert慎重に使うこともできます。将来の作業のためにローカルの変更を保持するかどうかによって異なります...


+1これは問題の最良の解決策ですが、この場合、すべての変更を取り除きたいと思っていました。もちろん、revert常に変更を加えたいとは思いません。だから私は将来あなたのやり方を使うでしょう。
Vinayak Garg

3

そのリポジトリのルートに移動し、次のコマンドを実行します

svn revert --depth=infinity .

1
svn revert -R .短いかもしれません
jesjimher

1

配置したいファイルに対してcommitコマンドを使用し、svn revertコマンドを使用して残りのローカル変更を破棄できます

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