2011-02-09 12 views
2

SQLとSubversionに基づいて自分のプログラムのデプロイメントツールを作成しました。フォルダを "削除"して同じ名前のフォルダを追加するにはどうしたらいいですか?

私はさまざまなバージョンのアプリケーションを作成し、それらの情報がSQLに格納されている間にSubversionで保存することができます。

「展開ツール」がかなりうまく動作するまで、問題が見つかりました。

アプリケーションのバージョンを作成するときに、ヘッドリビジョンをチェックアウトし、これを自分のプログラムで視覚化します。 最新のバージョンは、ファイルやフォルダの削除、名前の変更、追加や上書きによって編集することができます。

言って、私は自分の作業コピーに次のツリー構造を持っている場合:

- ProgramFiles 
    - Assemblies 
    - Data 
    - Type 1 
     - ... 
    - Type 2 
     - ... 
    - Type 3 
     - ... 

私は1つのディレクトリ(Data)を交換したいです。これは、svn deleteとその後にDirectory.Deleteを呼び出します。なぜなら、 "svn delete"は、コミットを行うときに削除のためのフォルダをマークするだけだからです。 新しいサブフォルダとファイルで "Data"という名前のフォルダをもう一度追加したいのですが、 "作業コピーの管理領域がありません"という例外が発生します。 私が問題を言うことができる限り、ProgramFilesの下にある.svnディレクトリには、このフォルダを読み取った場合、フォルダDataが削除されるという情報が格納されています。
私はフォルダを追加する前にコミットできることも知っていますが、それは私のリビジョン番号を "安定していないバージョン"で増加させるでしょう。

どのように私はこの問題を解決することができますか?

答えて

0

フォルダを削除するのではなくフォルダの内容を削除することはできますが(「.svn」フォルダは削除しないでください)、新しいファイルをそこに置くことはできませんか?

+0

1つのサブフォルダの名前が削除されたサブフォルダの1つと等しい場合は、サブフォルダと同じ問題が発生します。 –

+0

@Robin:ooh、nasty。じゃあ心配しないで。 –

1

1をコミットしてあなたが私はそれが私が「何をすることは不可能だと仮定してしばらくの間、問題について考えてきた後、あなたが、まあ別に

+0

あなたが正しいと他の方法がない場合、私は問題があります。 誰かが実際にフォルダを削除して(変更された内容で)フォルダを再度削除し、変更を取り消すことを決めた場合、改ざんされた改訂版があります。 –

0

を削除し、追加をコミットする必要があり、これを行うことはできませんここでやろうとしている私は考えがありました。

私が実際にやっていることは、交換、削除、追加の移動などを意味する作業コピーを作成していることです。これらの変更は私のプログラムで視覚化されます。 (ファイルシステムのフォルダ構造に基づいて)

これらの変更はすべて、ユーザーが新しい「パケット」として保存するまでコミットしないでください。これは、彼が進捗をキャンセルし、何もコミットされず、変更されないことを示します。

私は最初にエクスポートを行う回避策を試してみました。これらのフォルダとファイルを編集します。 私はコミットする準備ができたら、同じパスをチェックアウトし、作業コピーに存在しないものをすべて削除し、作業コピーにすべての新しいファイルを追加します。

これは唯一の回避策ですが、私の頭に浮かぶのは唯一のことです。

Subversionにはこのような方法がありますか?私の回避策は、プログラムをチェックアウトするだけではなく、そのエクスポートとチェックアウトのために、以前と同じくらい速く動いています。

また、両方のフォルダの比較も非常に複雑です。誰もがこれを簡略化するための解決策を知っていますか?

0

これを1回のコミットで実行する必要がある場合、それは可能ですが難しいです!

単純なsvn deleteの代わりにDirectory.Delete(...)の代わりに、既存のファイルとフォルダを再帰的にチェックする関数を記述する必要があります。

擬似コード:

function OverwriteFolder(old, new){ 
    foreach (file system) object in old or new{ 
     if object is in old and new{ 
      if object is file{ 
       overwrite file //no svn command needed 
      } 
      if object is folder{ 
       OverwriteFolder(old/object,new/object) 
      } 
     } 
     if file is in old and not new{ 
      svn delete object 
     } 
     if file is in new and not old{ 
      svn add object 
     } 
    } 
} 

今はコミット単一で動作するはずです。同じ名前のファイルでフォルダを置き換えようとしている場合、またはその逆の場合にのみ失敗します。

関連する問題