Bagaimana cara mengubah copy pekerjaan subversi UUID?

13

Saya baru saja memperbarui repositori Subversion dari versi 1.2.3 yang lama ke 1.6.0 via svnadmin dump / load . Semua repositori lama menggunakan UUID yang sama (repositori dibuat dengan menyalin repositori templat). Saya telah mengubah UUID pada beberapa repositori baru melalui svnadmin setuuid menjadi unik. Saya tidak bisa hanya memindahkan salinan pekerjaan saya yang ada dari repositori tersebut karena UUID berbeda. Saya tahu tentang mengekspor copy pekerjaan dan memeriksa dari repositori baru, tapi saya bertanya-tanya apakah ada cara untuk hanya mengubah UUID copy pekerjaan di tempat, seperti apa yang dilakukan svnadmin setuuid untuk repositori.

Ioan
sumber

Jawaban:

3

Anda perlu mengedit semua file 'entri' di repo yang Anda tarik. Jika repo memiliki banyak direktori, temukan + skrip sed akan membuat pekerjaan menjadi singkat.

john
sumber
17

Jawaban baru sejak Subversion 1.7 format copy bekerja. Anda memerlukan sqlite3utilitas baris perintah.

Di direktori root dari copy pekerjaan Anda, sekarang ada satu .svn/folder dengan database SQLite. Anda dapat meminta repositori saat ini yang UUIDdikenal untuk copy pekerjaan Anda dengan:

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

Akibatnya, perubahan UUIDdapat dilakukan dengan:

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

Tentu saja, simpan cadangan .svn/wc.dbfile sebelum mengajukan permintaan pembaruan. Hampir tidak ada kemungkinan entitas repositori Anda memiliki id yang berbeda atau ada beberapa baris dalam tabel itu tetapi Anda dapat memeriksa apakah Anda mendapatkan hasil yang tidak terduga.

Yves Martin
sumber
+1 bekerja dengan sempurna dengan repo yang direlokasi yang juga mengubah UUID
Amro
8

Berikut adalah perintah yang melakukan trik untuk SVN 1.6 dan di bawah ini:

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

Ganti old-uuiddan new-uuiddengan id yang sebenarnya.

Emil M
sumber
1
+1 Terima kasih atas solusinya. Ini tidak berfungsi untuk direktori yang memiliki spasi. "find. -type f -name entri -exec sed -i '/ old-uuid / new-uuid / g' {} \;" tanpa tanda kutip ganda tampaknya berfungsi.
Tommy
sry untuk necroing utas ini metode ini hanya menyelamatkan saya banyak waktu .. untuk orang lain yang mencoba ini, hanya ingin menambahkan catatan Sed pada MACOX tampaknya memerlukan penggunaan yang sedikit berbeda, Anda harus mengatakan sed -i "" 's/old-uuid/new-uuid/' dan berfungsi (hanya tanda kutip ganda ekstra kosong) ( ref )
Karthik T
2

Jawaban Yves Martin bekerja sangat baik untuk kami pada sejumlah copy pekerjaan dengan SVN 1.8, tetapi kami akhirnya menemukan kasus-kasus di mana itu tidak berhasil.

Menjalankan perintah Yves tanpa "di mana id = 1" bekerja di semua kasus untuk kami:

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

Menyelidiki mengapa ini terjadi, saya menemukan bahwa beberapa UUID disimpan ketika memindahkan repositori, bertentangan dengan intuisi Yves bahwa hal ini seharusnya tidak pernah terjadi.

Entri baru ke tabel REPOSITORY ditambahkan setelah pindah daripada memperbarui yang sudah ada, menyimpan id yang bertambah dengan akar repositori baru dan UUID-nya. Jadi kasus-kasus yang gagal berfungsi dengan baik adalah copy pekerjaan yang sudah dipindahkan di masa lalu: Perintah itu tampaknya bekerja, tetapi hanya UUID awal yang diubah, bukan yang sedang digunakan.

Seseorang dapat memeriksa daftar root yang tersimpan dan UUID dalam copy pekerjaan dengan perintah ini:

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

Saya akhirnya akan mencatat bahwa saya harus menggunakan serangkaian tanda kutip yang berbeda untuk file baris perintah / batch Windows, sebagai berikut:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"
Julien Barnoin
sumber
Terima kasih untuk perincian ketika copy pekerjaan telah dipindahkan, saya tidak mengetahui perilaku ini
Yves Martin
1

Bagian " Mengelola Gudang Repositori " di svn red-bean book mungkin memiliki jawaban yang Anda cari.

Yousouser
sumber
Bagian itu berbicara tentang repositori UUID, tidak berfungsi menyalin UUID.
Ioan
@Ian: Mengutip dari bagian itu: Untuk orang-orang yang menggunakan versi Subversion lebih awal dari 1,5, tugas-tugas ini sedikit lebih rumit. Anda dapat secara eksplisit mengatur UUID repositori dengan memiparkan rintisan file dump repositori yang membawa spesifikasi UUID baru melalui svnadmin load --force-uuid REPOS-PATH - Bukankah ini yang Anda butuhkan?
Yasouser
1
Sekali lagi, tidak, saya tidak berbicara tentang repositori UUID, tetapi bekerja menyalin UUID; copy pekerjaan sama dengan checkout.
Ioan
Anda tidak dapat mengubah copy pekerjaan UUID ke repo server tanpa memperbarui atau svn mengalihkan copy pekerjaan ke lokasi [baru / yang ada] repo.
Yasouser