Subversionの作業コピーのUUIDを変更するには?


13

私は最近svnadmin dump / loadを介してSubversionリポジトリを古い1.2.3バージョンから1.6.0に更新しました。古いリポジトリはすべて同じUUIDを使用していました(リポジトリはテンプレートリポジトリをコピーして作成されました)。svnadmin setuuidを介していくつかの新しいリポジトリのUUIDを一意に変更しました。UUIDが異なるため、これらのリポジトリの既存の作業コピーを単に移動することはできません。作業コピーをエクスポートして新しいリポジトリからチェックアウトすることは知っていますが、リポジトリに対してsvnadmin setuuidが行うように、作業コピーのUUIDをインプレースで変更する方法があるかどうか疑問に思っていました。

回答:


3

プルされたレポのすべての「エントリ」ファイルを編集する必要があります。リポジトリに多数のディレクトリがある場合は、sedスクリプトを使用してタスクを短時間で処理します。


17

Subversion 1.7作業コピー形式以降の新しい回答。sqlite3コマンドラインユーティリティが必要です。

作業コピーのルートディレクトリに.svn/、SQLiteデータベースのある単一のフォルダーができました。以下を使用UUIDして、作業コピーで既知の現在のリポジトリを照会できます。

$ sqlite3 .svn/wc.db 'select uuid from REPOSITORY where id=1'
b6dc3e6c-5320-4549-b231-c153d86d7525

その結果、変更UUIDは次の方法で実行できます。

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032" where id=1'

もちろん、.svn/wc.db更新クエリを呼び出す前にファイルのバックアップを保持してください。リポジトリエンティティのIDが異なるか、そのテーブルに複数の行がある可能性はほとんどありませんが、予期しない結果が得られるかどうかを確認できます。


1はまた、UUIDを変更することを再配置レポと完璧に働いた
アムロ

8

SVN 1.6以前のトリックを実行するコマンドは次のとおりです。

find . -type f -name entries -exec sed -i 's/old-uuid/new-uuid/g' {} \;

old-uuidnew-uuidを実際のIDに置き換えます。


1
+1解決策をありがとう。これは、スペースのあるディレクトリでは機能しません。「。-type f -nameエントリを検索-exec sed -i 's / old-uuid / new-uuid / g' {} \;」二重引用符なしで機能しているようです。
トミー

このスレッドを壊すので、この方法で時間を大幅に節約できました。これを試す他の人は、メモを追加したいだけです。MACOXにわずかに異なる使用を必要とするようだsedの、uは言う必要がある sed -i "" 's/old-uuid/new-uuid/' ((ちょうど余分な空の二重引用符)とそれが動作REF
カルティクT

2

Yves Martinの答えは、SVN 1.8の多くの作業コピーでうまく機能しましたが、機能しない場合がありました。

「where id = 1」なしでYvesのコマンドを実行すると、すべてのケースで機能しました。

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032"'

なぜこれが起こったのかを調査すると、リポジトリが再配置されたときに複数のUUIDが保存されていることがわかりました。

REPOSITORYテーブルへの新しいエントリは、既存のテーブルを更新するのではなく、再配置後に追加され、新しいリポジトリルートとそのUUIDでインクリメントされたIDを格納します。したがって、正常に動作しなかったケースは、過去に既に移動された作業コピーでした。コマンドは動作しているように見えますが、現在使用されているものではなく、初期UUIDのみが変更されました。

次のコマンドを使用して、作業コピーに保存されているルートとUUIDのリストを確認できます。

$ sqlite3 .svn/wc.db 'select id,uuid,root from REPOSITORY'

最後に、次のように、Windowsコマンドライン/バッチファイルに異なる引用符のセットを使用する必要があったことに注意します。

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"

作業コピーが、私は、この動作を認識していませんでした、再配置された詳細をありがとう
イヴ・マーティン

1

svn red-beanブックの「リポジトリUUIDの管理」セクションに、探している答えがあるかもしれません。


このセクションでは、作業コピーUUIDではなく、リポジトリUUIDについて説明します。
イオアン

@Ioan:そのセクションからの引用:1.5より前のバージョンのSubversionを使用している人にとって、これらのタスクはもう少し複雑です。svnadmin load --force-uuid REPOS-PATHを使用して、新しいUUID仕様を含むリポジトリダンプファイルスタブをパイピングすることにより、リポジトリのUUIDを明示的に設定できます。これは必要なものではありませんか?
-yasouser

1
繰り返しますが、私はリポジトリ UUID についてではなく、作業コピー UUID について話しています。作業コピーはチェックアウトと同じです。
イオアン

リポジトリの[新規/既存]の場所に作業コピーを更新またはsvn切り替えずに、作業コピーのUUIDをサーバーリポジトリのUUIDに変更することはできません。
-yasouser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.