2009-10-27 4 views
32

私の状況では、ソースコントロール(特にlog4j.propertiesファイル)の下で迷惑をかけているファイルの束がsvnにチェックインされているので、バージョンコントロールから削除したいと思います。私はすでにthis questionthis oneのように自分のローカル作業コピーでsvnのバージョン管理からファイルを削除する方法を知っていますが、それは私が探しているものではありません。すべての作業コピーからファイルを削除せずにファイルをsvnのバージョン管理から削除するにはどうすればよいですか?

svn rm --keep-localでファイルを削除すると、他のすべてのユーザーがリポジトリからプルすると、log4j.propertiesのローカルコピーが消え、環境がクラッシュするという問題があります。私がしたいのは、リポジトリのバージョン管理からファイルを削除するだけですが、他の人がリポジトリから引き出すときには、自分のマシンに--keep-localを使用したようになります。 log4j.propertiesファイルが貼り付けられていますが、バージョンは変更されません。

これも可能ですか?私はそれがsvnが持っていない機能だと思う。私は通常、同様の状況で何

+1

行います保存の$ EDITORを起動します矛盾。ファイルがプロジェクトの必須部分である場合、それが存在しない場合、それを削除すると誰かの環境がクラッシュするのはなぜですか? - ソース管理に属します。 –

+2

ファイルが必要ではないというわけではありません。デプロイメントの成果物は、あるユーザーから次のユーザーには変わりません。たとえば、ファイルの1つにディレクトリへのパス名が含まれています。下記のDon Kirkbyの答えのサンプルファイルがあります。 –

答えて

8

このようなファイルが実際にたくさんある場合は、svndumpfilter操作を使用して、1つの石で2匹の鳥を殺すことができます。アイデアは、サーバー上のリポジトリのダンプを作成し、保持したくないファイルを除外し、その結果を新しいリポジトリにロードすることです。次に古いものの代わりに新しいものを置きます。

これは、ユーザーがリポジトリに明示的にアクセスしていない場合は注意が必要です。しかし、実際には、ファイルを削除するのではなく、大きなファイルを削除することになります。副作用として、次にユーザーが更新を行うときに、これらのファイルはリポジトリに存在しないかのように無視されます。私たちはその場所を持たないバイナリを削除するために数回それをしなければなりませんでした。

Link to the related documentation

簡単な例(コマンドはもちろん、より多くの柔軟性を提供しています):

svnadmin create repos_new 
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new 

それは、サーバー上のリポジトリに触れているので、私はあなたが注意事項(古いリポジトリを保つ)を取る必要があることを改めて強調したいです。それほど迷惑でないファイルに対しては、Donが提案する方法はそれほど劇的ではなく、好ましい方法です。

このような状況を回避するには、ディレクトリに対応するsvn:ignoreプロパティを設定することができます。また、グローバルな無視を使用するように促すこともできます(残念ながら各クライアントに設定する必要があります)ファイルのカテゴリを先取りして拒否する。

+1

グッドグレービー。これはたくさんの仕事のように思えますし、ブートするのは危険です(私はリポジトリへのシェルアクセス権がありません)。しかし、それは解決策のように見えます。 –

+1

作業の量は、主に除外するファイルを教えているので、リンクで詳しく説明されているようにいくつかの手順で行うことができます。元のリポジトリに実際に触れないことをお勧めします。最悪の場合、新しいリポジトリを再作成するだけです。オリジナルを別の場所に移動し、新しいものの名前を元に戻し、すべてがうまくいっていることを確認してください:-) – RedGlyph

7

log4j.properties.templateまたはlog4j.properties.defaultlog4j.propertiesのリポジトリコピーの名前を変更することであり、私はsvn:ignoreリストにlog4j.propertiesを追加します。その後、すべてのユーザーはそのファイルを作業コピーのlog4j.propertiesにコピーする必要があります。これをもっと使いやすくするために、ビルドスクリプトにローカルコピーが見つからない場合にリマインダメッセージを出力するチェックを入れることができます。

+0

これらのファイルの多くは、実際には非常によく似たものがあり、新鮮な環境を作り上げるには、これらのファイルをコピーする必要があります。しかし、私はすべての人がsvnから削除しているファイルをもう一度コピーする必要はありません。 –

+2

@Tim:時には成長するには少しの痛みが必要です。 – NotMe

+1

しかし、ビルドスクリプトのアイデアは興味深いです。サンプルファイルが存在しない場合は自動的にサンプルファイルをコピーし、既存のコピーをリポジトリから削除するスクリプトを書くことができます。しかし、それは別の質問です... –

14

秘密は、無視リストにあることを確認することです。の前に、の削除をコミットします。その順序で実行すると、削除は他の作業コピーに伝播しません。

私たちはまだsvn 1.4を使用しているので、--keep-localオプションは利用できません。しかし、サーバーパスと-m commitメッセージを使用して削除することで、同じことを達成できます。

私の例では、誤ってnbprojectというディレクトリをコミットしました。 IDE(NetBeans)用の開発者プロジェクトの設定です。私は全員の作業コピーからそれを削除したくなかったし、すべての設定を失うだろう!しかし、これはトリックでした。親ディレクトリ最低料金:

$ cd trunk 
$ svn propedit svn:ignore . 

は独自の行にnbproject追加し、

$ svn commit -m 'Ignore nbproject' 
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn' 
+3

実際には、これは機能しません。削除はまだ伝播しています。 : –

+1

他のものより前に設定を無視するだけでアップデートする必要があるかもしれませんか? – tgkprog

-2
svn delete --keep-local <PATH> 

これはある

+4

あなたは疑問を理解しましたか?人々の作業ディレクトリからファイルを削除しない 'svn delete --keep-local' 'svn delete --keep-local'はリビジョン管理から削除します。 –

関連する問題