Bagaimana cara memindahkan satu folder dari satu repositori Subversion ke repositori lain?

156

Saya memiliki folder "docs" di repositori Subversion yang bernama "project". Saya sampai pada kesimpulan bahwa itu harus benar-benar disimpan di bawah repositori Subversion terpisah bernama "project_docs".

Saya ingin memindahkan folder "docs" ( dan semua revisinya ) ke repositori "project_docs". Apakah ada cara untuk melakukan ini?

kiri
sumber

Jawaban:

183

Jika Anda memiliki akses ke repositori itu sendiri (bukan salinan yang berfungsi), Anda seharusnya dapat membuang repositori saat ini, memfilternya untuk hanya menyertakan informasi tentang folder dokumen, dan memuatnya ke repositori lain.

Akan menjadi sesuatu seperti ini:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Tanpa akses ke repositori, Anda tidak dapat mempertahankan riwayat revisi dan Anda harus puas menyalin file ke dalam repositori baru dan melakukan.

Samuel
sumber
1
Contoh yang bagus. Perhatikan bahwa sebagaimana dinyatakan dalam dokumentasi yang saya tautkan, solusi ini akan memberi nomor ulang semua revisi sehingga tidak ada "kosong". Sesuatu yang perlu diingat jika Anda merujuk revisi dokumen di tempat lain.
Adam Bellaire
1
Saya menyarankan penghapusan revisi kosong untuk menghindari menambahkan banyak revisi kosong ke repositori target, kemungkinan besar membingungkan siapa pun yang tidak tahu tentang beban. Karena --preserve-revprops akan menyimpan pesan komit alih-alih menggunakan yang default.
Samuel
11
Terima kasih atas jawabannya. Jika ada yang perlu tahu, jika Anda membutuhkan lebih dari satu folder, cukup beri spasi di antara mereka dalam daftar include. Ex. ... termasuk folderOne folderTwo
Robin Robinson
6
Memberi nomor revisi revisi mungkin merupakan ide yang buruk, karena pesan yang dikomit dan alat pelacakan masalah mungkin merujuk mereka
Wim Coenen
5
Ini berhasil untuk saya. Saya pengguna windows (Visual SVN Server) dan perintah pertama saya terlihat seperti ini, jika itu membantu siapa pun:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris
30

svndumpfilter memiliki kesalahan serius - jika file atau jalur disalin dari jalur yang Anda filter ke yang Anda filter, svndumpfilter tidak akan dapat mengisi riwayat dan pekerjaan itu akan gagal.

Anda dapat menggunakan svndumpfilter2 jika Anda mengalami masalah ini.

compie
sumber
4
Berikut tautan yang lebih baik untuk svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin
Anda dapat menambahkan jalur yang diperlukan ke daftar ... sespesifik mungkin ... dan kemudian menghapus entri-entri dari proyek setelah impor.
James Gawron
6

Ini dibahas dalam dokumentasi SVN. Lihat bagian Pemeliharaan Repositori di svndumpfilter... Ini secara khusus menjelaskan cara membuang proyek dari repositori pusat dan memindahkannya ke repositori baru yang terpisah.

Adam Bellaire
sumber
2

Saya tidak percaya Anda bisa melakukannya dari jarak jauh (yaitu, tanpa salinan lokal). Tapi ini harusnya berfungsi: svn exportfolder dari server asli, lalu svn addke repo baru Anda.

Suka:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Sunting: Doh, ini menjatuhkan sejarah. Gunakan svnadminseperti yang dijelaskan Samuel .

Peter Stone
sumber
3
Namun, Anda tidak dapat menyimpan revisi tanpa akses ke repositori itu sendiri. Jika Anda hanya dapat memiliki salinan yang berfungsi, ini adalah yang terbaik yang bisa ia lakukan.
Samuel
2

Untuk referensi di masa mendatang:

Dokumentasi SVN dengan jelas melaporkan:

Jika Anda berencana mengedit file dump secara manual untuk menghapus direktori tingkat atas, pastikan editor Anda tidak diatur untuk secara otomatis mengonversi karakter end-of-line ke format asli (misalnya, \ r \ n ke \ n), karena konten tidak akan setuju dengan metadata. Ini akan membuat file dump tidak berguna.

Gunakan sed atau Vim untuk mengganti direktori tingkat atas, tetapi nama direktori ini juga terdapat di dalam file proyek !!!! Ini menyebabkan galat checksum load SVN.

Jadi ketika Anda melakukan operasi ini, jangan lakukan pergantian string dengan sed hanya nama path.

Ganti "Node-path: old_path" dengan "Node-path: new_path". Lihat buku SVN bab 5 "administrasi repositori" untuk lebih jelasnya.

nios
sumber
1

Saya mencoba menggunakan jawaban yang diterima, tetapi saya memiliki repositori besar dan saya ingin mengekspor direktori kecil, dan saya tidak mampu untuk membuang seluruh repositori.

Jadi, saya hanya mengekspor revisi di mana direktori saya berubah (Ini mungkin tidak berfungsi jika direktori yang ingin Anda ekspor memiliki referensi ke tempat lain di repo Anda).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Anda harus mengganti URL repo Anda ( URL_to_docs), lokasi di server ( /svn/old_repo) dan path ke dokumen di repositori ( path/to/docs)

Anda dapat dengan mudah mengedit Anda docs_only.dumpjika Anda ingin mengubah lokasi direktori doc Anda di repositori baru Anda.

Renato
sumber