0

StarTeamからSVNに移行し、各リリースのスナップショットを撮ることにしました。ただし、リビジョン1に存在していたファイルをリビジョン2で削除すると、問題が発生します。

ファイルが欠落しているときにスナップショットをコミットするにはどうすればよいですか?

trunk / src /フォルダーを完全に削除してから、新しい/ trunk / src /フォルダーに置き換えようとしましたが、不足しているファイルとの競合が発生するようです。TortoiseSVNは、すべてをsvn add」すると、ファイルが欠落していることを検出し、コミットすると、欠落しているファイルを削除しようとしているように見えますが、失敗しているようです。おそらく、ファイルを削除した後にディレクトリを削除しようとしているためです。そのディレクトリに?

次のエラーが発生します。

deleting C:\trunk\src\myfile.h  // this one's okay
deleting C:\trunk\src\res
Commit failed (details follow):
Directory 'C:\trunk\src\res' is out of date
Item '/trunk/src/res' is out of date
You have to update your working copy first.

この問題の解決策は何ですか?確かに私はこの問題に遭遇した最初の人ではありませんが、グーグルやスタックオーバーフローで何も見つからないようです。スクリプトを実行して実行することを提案する人もいますが、それでもプロセスについて混乱しています。不足しているファイルがローカルで削除されるように、古いトランクフォルダを削除する必要がありますか?または、スクリプトを使用して差分を取り、削除する必要がありますか?

ありがとう!

古い(不明確な)投稿:SVNへの移行、古いファイルの削除について混乱

編集:

これは、あるスナップショットから次のスナップショットに移ります。別のリポジトリ(StarTeam)から移行しているので、トランクには何もありませんでした。さまざまなスナップショットをすべてチェックインし、削除されたファイルも削除してもらいたいだけです。トランクに何も入っていない場合はタグ付けするのは悪い考えではありませんか?

4

5 に答える 5

3

実際には、svn-merge-repos.plと呼ばれるSubversionスクリプトがあります。

Subversionがどのように機能するかという概念をあなたが理解しているとは100%確信していません。Subversionの本を読みましたか?

Subversionには、多くのバージョン管理システムに見られるような実際のメタデータはありtags/labelsません。branches代わりに、タグとブランチを独自のディレクトリに配置します。ブランチまたはタグを作成するには、ブランチまたはタグを作成するものをディレクトリにコピーします。

# Creating a branch for 2.0 development from trunk
$ cp http://server/svn/module/trunk http://server/svn/module/branches/2.0

# Tagging my 2.0 development as 2.0.1
$ cp http://server/svn/module/branches/2.0 http://server/svn/module/tags/2.0.1

理論的には、リポジトリをマージする必要なしに、作業中のリリースとブランチごとに新しいディレクトリbranchまたはディレクトリを作成するだけで済みます。tagこれは、StarTeamからSubversionへの変換を行ったときに行ったことです。問題は、リビジョン2.0.1と2.0.2は共通の履歴を共有していないため、これらの関係が失われることです。99%の場合、これは実際には問題ではありません。何か必要な場合は、いつでも元のStarTeamアーカイブに戻ることができます。数ヶ月で、誰も気にしないでしょう。

ただし、ブランチとタグの関係を知っていて、その情報を保持したい場合は、上記の2ステップのスクリプトを実行する必要があります。

たとえば、、タグ、タグ、およびタグ2.0からのブランチがある場合、次のようにすることができます。trunk2.0.12.0.22.0.3

  • ブランチ2.0.1リリースをトランクに配置します。
  • トランクをにコピーしbranches/2.0ます。
  • 次のブランチをトランクに置き、そのブランチにコピーします(svn-merge-repos.plスクリプトを使用)
  • 最後に、現在のトランクを配置します。
  • 次に、そのbranches/2.0ディレクトリに移動し、それをにコピーしtags/2.0.1ます。svn-merge-repos.plスクリプトを使用して、で2.0.1リリースを作成し、branches/2.0それをにコピーしtags/2.0.2ます。2.0ブランチの先端に到達するまで続けます。

それにはかなり時間がかかりますが、実行可能です。前回それをしたとき、変換全体を行うのに約1週間半かかりました。幸いなことに、私は最初にトランクを実行し、次に1日で実行できるアクティブリリースを実行しました。次に、あまりアクティブでないものに戻りました。

于 2011-12-20T17:44:04.720 に答える
1

私は確かにSVNの専門家ではありませんがsvn delete、次のコミット時に削除するアイテムに対してコマンドを発行する必要があると思います。ここで説明します。

于 2011-12-20T17:21:05.950 に答える
1

svn-load-dirs.plを使用する必要があります:

「このPerlスクリプトは、多数のディレクトリをSubversionにロードするように設計されています。これは、特定のパッケージに多数の.zipまたはtar。{Z、gz、bz2}があり、それらをSubversionにロードする場合に便利です。 「」

基本的にあなたがすることは:

  • すべてのタグを時系列でエクスポートする
  • 空のリポジトリを作成する
  • svn_load_dirs.plを使用して、Subversionのタグの後にタグを「スタック」します。

svn_load_dirs.plは、タグごとに1つのリビジョンを作成し、インポートごとに(subversion-)タグを作成することもできます。削除および追加されたすべてのファイルを追跡し、適切なsvnアクションを実行します。これは、空のトランクから明示的に開始できることを意味します

于 2011-12-21T01:11:32.120 に答える
1

代わりにタグを作成する必要があります。
編集: svn status は、次のようにすべての削除されたファイルを印刷できる
すべての変更を一覧表示し ます。grep -E'^!' | awk'{print $ 2}'> / tmp /changes バッチを使用して各ファイルに対してsvndeleteを実行できます;) 編集:(SVN移行ハウツー) projectAという名前のプロジェクトと空のSVNリポジトリがあると仮定します。 まず、次のようなフォルダ構造を作成する必要があります。








projectA /
|-ブランチ
|-タグ
|-トランク


次に、プロジェクトファイルをインポートします。

projectA /
|-ブランチ
|-タグ
`-トランク
    |-README
    `-src

インポート後、最初のリリースを「マーク」するタグを作成できます。

projectA /
|-ブランチ
|-タグ
| `-リリース-1
`-トランク
    |-README
    `-src


この時点以降、必要に応じてファイルを編集する必要があります。すべての編集が「良い」と思ったら、コミットします。
いくつかのコミットの後、解放したい場合は、タグを作成します。

トランクには、常に最新バージョンのコードが含まれている必要があります。
ルーキーの場合は、WindowsでTortoiseSVNを使用することを強くお勧めします;)

于 2011-12-20T17:23:25.493 に答える
0

あなたの質問から、あなたはSVNの誤用を完了しているようです。コードが大幅に変更された場合を除いて、trunk/srcフォルダー全体を削除して新しいフォルダーに置き換える意味はありません。

代わりに、リリースのタグを作成してください。

于 2011-12-20T17:23:08.330 に答える