2

SQL と Subversion に基づいて、自分のプログラム用の展開ツールを作成しました。

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

私の「展開ツール」がうまく機能するまでは問題がありました。

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

たとえば、作業コピーに次のツリー構造があるとします。

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

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

どうすればこの問題を解決できますか?

4

4 に答える 4

2

1回のコミットでこれを行うことはできません。削除と追加を別々にコミットする必要があります

于 2011-02-09T12:57:07.623 に答える
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
        }
    }
}

これで、1回のコミットで機能するはずです。フォルダを同じ名前のファイルに置き換えようとしている場合、またはその逆の場合にのみ失敗します。

于 2011-09-01T19:34:27.207 に答える
0

さて、私がここでやろうとしていることは不可能であると仮定してしばらく考えた後、私は考えを思いつきました。

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

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

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

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

そのようなことをする転覆の方法はありますか?私の回避策は、プログラムをチェックアウトするだけでなく、そのエクスポートとチェックアウトのために、以前の半分の速度でしか実行されません。

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

于 2011-02-09T14:31:28.577 に答える
0

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

于 2011-02-09T11:30:06.153 に答える