Periksa satu file dari Subversion

320

"Tidak mungkin untuk memeriksa satu file. Tingkat pemeriksaan terbaik yang dapat Anda lakukan adalah pada tingkat direktori."

Bagaimana cara saya mengatasi masalah ini saat menggunakan Subversion?

Kami memiliki folder ini di Subversion tempat kami menyimpan semua gambar kami. Saya hanya ingin memeriksa satu file (gambar) dari itu. Folder ini sangat besar dan memiliki banyak hal lain yang tidak saya butuhkan sekarang.

bluegene
sumber
Anda bisa melakukannya dengan cara lain. Masuk ke server produksi dan svn upke direktori lokal Anda di komputer Anda.
Neocortex

Jawaban:

403

Jawaban sederhananya adalah Anda svn exportmengambil file alih-alih memeriksanya.

Tapi itu mungkin bukan yang Anda inginkan. Anda mungkin ingin mengerjakan file dan memeriksanya kembali, tanpa harus mengunduh GB sampah yang tidak Anda butuhkan.

Jika Anda memiliki Subversion 1.5+, lakukan checkout jarang:

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

Untuk versi SVN yang lebih lama, Anda mungkin mendapat manfaat dari yang berikut ini:

  • Periksa direktori menggunakan revisi kembali di masa lalu, ketika itu kurang penuh sampah yang tidak Anda butuhkan.
  • Perbarui file yang Anda inginkan, untuk membuat revisi campuran. Ini berfungsi bahkan jika file tidak ada dalam revisi yang Anda periksa.
  • Keuntungan!

Alternatif (misalnya jika direktori memiliki terlalu banyak sampah langsung dari revisi di mana ia dibuat) adalah dengan melakukan URL-> URL salin file yang Anda inginkan ke tempat baru di repositori (efektif ini adalah cabang kerja file). Periksa direktori itu dan lakukan modifikasi Anda.

Saya tidak yakin apakah Anda kemudian dapat menggabungkan salinan yang dimodifikasi kembali sepenuhnya di repositori tanpa salinan target yang berfungsi - saya tidak pernah perlu melakukannya. Jika demikian maka lakukanlah.

Jika tidak maka sayangnya Anda mungkin harus menemukan orang lain yang memiliki seluruh direktori diperiksa dan minta mereka melakukannya. Atau mungkin pada saat Anda melakukan modifikasi, sisanya akan selesai mengunduh ...

Steve Jessop
sumber
13
Solusi yang sangat sederhana adalah mengakses repositori dengan browser web.
dolmen
11
@dolmen - Dengan asumsi tidak perlu memodifikasi file, mungkin (dan dengan asumsi antarmuka web sedang berjalan untuk repositori itu). Saya menggunakan command-line SVN, jadi bagi saya, lebih mudah digunakan svn exportdaripada menggunakan antarmuka web, jika saya tahu file apa yang saya inginkan. Penanya sudah menggunakan SVN, jadi saya kira itu tergantung klien apa dan apakah klien itu membuatnya mudah digunakan svn export. Saya menemukan antarmuka web lebih baik untuk browsing daripada svn ls:-)
Steve Jessop
2
Klien SmartSVN akan mengunci file individual jika Server Subversion Anda mendukungnya. Dan ada kait yang memerlukan pemeriksaan harus dilakukan sebelum file biner / file yang dapat dieksekusi dapat diperiksa. Tidak benar-benar membuat dua orang memodifikasi denda biner dan menggabungkannya. Ini mungkin fitur baru yang tidak tersedia saat pertanyaan ini diajukan.
TamusJRoyce
@Tamus: "Tidak masuk akal," setuju, tetapi dalam kasus yang saya jelaskan penggabungan ini hanya untuk mengembalikan versi baru ke lokasi semula. Tidak diharapkan file biner telah dimodifikasi di target penggabungan. Jadi file itu sendiri tidak memerlukan "penggabungan" selain mengganti versi lama dengan yang baru, hanya saja SVN menyebutnya dan mencatat dari mana perubahan itu berasal untuk referensi di masa mendatang. Anda benar, penghindaran konflik dapat ditegakkan dengan mengunci file selama durasi.
Steve Jessop
1
TortoiseSVN dapat memeriksa file individual. Saya percaya itu melakukan hal yang sama di balik layar untuk mencapai itu.
Mike Starov
109

Coba svn exportalih-alih svn checkout. Itu berfungsi untuk file tunggal.

Alasan untuk pembatasan ini adalah bahwa checkoutmembuat copy pekerjaan, yang berisi meta-informasi tentang repositori, revisi, atribut, dll. Metadata itu disimpan dalam subdirektori bernama '.svn'. Dan satu file tidak memiliki subdirektori.

Mnementh
sumber
2
Peringatan: Versi yang sangat lama svntidak akan melakukan ekspor file tunggal.
Mladen Jablanovi
5
Ini adalah metode yang unggul jika Anda hanya ingin mengambil versi terbaru dari skrip tertentu sebagai bagian dari penggunaan, atau sesuatu.
william.berg
2
Peringatan itu adalah peregangan bahkan kembali pada tahun 2011 tetapi versi yang sangat lama dapat dilakukan svn cat $url_to_file_in_repo > $local_file_name.
cprn
53

Gunakan svn catatau svn export.

Untuk itu, Anda tidak perlu mengambil direktori kerja, tetapi Anda tidak akan dapat melakukan perubahan apa pun yang Anda lakukan. Jika Anda perlu melakukan perubahan dan mengkomitnya, Anda memerlukan direktori yang berfungsi, tetapi Anda tidak harus mengambilnya sepenuhnya. Periksa revisi di mana direktori itu masih / hampir kosong, dan kemudian gunakan 'svn cat' untuk mengekstrak file dari HEAD.

Milan Babuškov
sumber
svn cat svn://.../my_file.txtpersis apa yang saya cari. Saya bekerja di repositori svn://hanya (tidak http://), dan tampaknya antarmuka websvn terbaru tidak menyediakan unduhan file mentah (atau kita salah mengonfigurasi atau saya buta). Lebih mudah melakukan ini daripada checkout+ uphanya untuk mengunduh file.
ribamar
12

Jika Anda ingin melihat readme.txt di repositori Anda tanpa memeriksanya:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Ini adalah file README. Anda harus membaca ini.

Kiat: Jika copy pekerjaan Anda kedaluwarsa (atau Anda memiliki modifikasi lokal) dan Anda ingin melihat revisi HEAD dari file dalam copy pekerjaan Anda, svn cat akan secara otomatis mengambil revisi HEAD ketika Anda memberikan path:

$ cat foo.c
File ini ada dalam copy pekerjaan lokal saya dan memiliki perubahan yang telah saya buat.

$ svn cat foo.c
Revisi terbaru segar dari repositori!

Sumber

GEOCHET
sumber
Anda juga dapat langsung menggunakan klien HTTP apa pun. Browser web Anda, atau alat baris perintah seperti curlatau wget.
dolmen
9

Solusi setara TortoiseSVN dari jawaban yang diterima (saya telah menulis ini dalam dokumen internal untuk perusahaan saya karena kami baru mengadopsi SVN) berikut. Saya pikir akan sangat membantu untuk berbagi di sini juga:

Memeriksa satu file: Subversion tidak mendukung checkout satu file, itu hanya mendukung checkout struktur direktori. (Referensi: http://subversion.tigris.org/faq.html#single-file-checkout ). Ini karena dengan setiap direktori yang diperiksa sebagai copy yang berfungsi, metadata mengenai modifikasi / revisi file disimpan sebagai folder tersembunyi internal (.svn / _svn). Ini tidak didukung saat ini (v1.6) untuk file tunggal.

Alternatif strategi yang disarankan: Anda harus melakukan bagian direktori checkout hanya sekali, setelah itu Anda dapat langsung pergi dan checkout file tunggal Anda. Lakukan checkout jarang dari folder induk dan struktur direktori. Checkout yang jarang pada dasarnya hanya memeriksa struktur folder tanpa mengisi file konten. Jadi Anda checkout hanya struktur direktori dan tidak perlu checkout SEMUA file seperti yang menjadi perhatian. Referensi: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Langkah 1 : Lanjutkan ke browser repositori

Langkah 2 : Klik kanan folder induk dalam repositori yang berisi semua file yang ingin Anda kerjakan dan Pilih Checkout.

Langkah 3 : Di dalam jendela sembulan yang baru, pastikan direktori checkout menunjuk ke lokasi yang benar pada PC lokal Anda. Akan ada juga menu dropdown berlabel "checkout depth". Pilih "Hanya item ini" atau "Anak-anak langsung, termasuk folder" tergantung pada kebutuhan Anda. Opsi kedua direkomendasikan sebagai, jika Anda ingin bekerja di folder bersarang, Anda dapat langsung melanjutkan waktu berikutnya jika tidak, Anda harus mengikuti seluruh prosedur ini lagi untuk folder bersarang.

Langkah 4 : Folder induk sekarang harus tersedia dalam folder yang Anda pilih secara lokal dan sekarang sedang dipantau dengan SVN (folder tersembunyi ".svn" atau "_svn" sekarang harus ada). Dalam repositori sekarang, klik kanan satu file yang ingin Anda periksa sendiri dan pilih opsi "Perbarui Item untuk direvisi". File tunggal sekarang dapat dikerjakan dan diperiksa kembali ke dalam repositori.

Saya harap ini membantu.

Kaushik Gopal
sumber
8

Anda dapat melakukannya dalam dua langkah:

  1. Periksa repositori SVN kosong dengan informasi meta saja:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Jalankan svn upuntuk memperbarui file yang ditentukan:

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    
pengguna2920375
sumber
6

Pembaruan untuk berjaga-jaga jika yang benar-benar Anda butuhkan dapat dicakup dengan memasukkan file ke dalam checkout folder lain.

Karena SVN 1.6 Anda dapat membuat file eksternal , semacam tautan svn. Ini berarti bahwa Anda dapat memiliki folder berversi lain yang menyertakan satu file. Melakukan perubahan pada file di checkout folder ini juga dimungkinkan.

Ini sangat sederhana, checkout folder yang ingin Anda sertakan file, dan cukup tambahkan properti ke folder

svn propedit svn:externals .

dengan konten seperti ini:

file.txt /repos/path/to/file.txt

Setelah Anda melakukan ini, file tersebut akan muncul di checkout folder berikutnya. Pada dasarnya ini berfungsi, tetapi ada beberapa batasan seperti yang dijelaskan dalam dokumentasi yang ditautkan di atas.

blanne
sumber
4

Pergi ke repo-browser klik kanan file dan gunakan 'Save As', saya menggunakan TortoiseSVN.

Dave Anderson
sumber
4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(Edit filename.log)

svn commit -m "this is a comment."
anon
sumber
4

Jawaban Steve Jessop tidak berhasil untuk saya. Saya membaca file bantuan untuk SVN dan jika Anda hanya memiliki gambar, Anda mungkin tidak ingin memeriksanya lagi kecuali Anda menggunakan Photoshop, jadi ekspor adalah perintah yang lebih baik daripada checkout karena tidak berversi (tapi itu kecil).

Dan itu --depth ARG tidak boleh kosong tetapi file untuk mendapatkan file di direktori langsung. Jadi, Anda akan mendapatkan semua bidang, bukan hanya satu, tetapi kosong tidak mengembalikan apa pun dari repositori.

 svn co --depth files <source> <local dest>

atau

svn export --depth files <source> <local dest>

Adapun jawaban lainnya, cat memungkinkan Anda membaca konten yang hanya baik untuk teks, bukan gambar dari semua hal.

Vass
sumber
1
Intinya --depth emptyadalah bahwa file lain tidak boleh diperiksa, dan Anda kemudian bisa mendapatkan hanya satu file svn up <source/file>. Dengan svn export, tidak perlu melakukan ini, cukup tentukan file.
Kevin Vermeer
@reemrevnivek - Anda benar. baik pertanyaannya hanya meminta satu file, ini bekerja tanpa memeriksa seluruh struktur file direktori bahkan jika itu kosong.
Vass
4

Saya hanya menjelajahinya dan mengekspor satu file. Jika Anda memiliki akses HTTP, cukup gunakan browser web untuk menemukan file dan ambil.

Jika Anda perlu mengembalikannya setelah mengeditnya, itu mungkin sedikit lebih membosankan, tapi saya yakin mungkin ada svn importfungsi ...

Oli
sumber
3

Lakukan sesuatu seperti ini:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

Pada dasarnya idenya adalah membuat direktori tempat Anda ingin mengambil file dari SVN. Gunakan svn catperintah dan arahkan output ke file bernama yang sama. Secara default, kucing akan membuang informasi di stdio.

Manish Singh
sumber
2

Jika Anda hanya ingin file tanpa menggunakan informasi revisi

svn export <URL>
Ted
sumber
2

Dengan Subversion 1.5, menjadi mungkin untuk memeriksa (semua) file direktori tanpa memeriksa subdirektori apa pun (berbagai flag --depth). Bukan apa yang Anda minta, tetapi bentuk "kurang dari semua."

jackr
sumber
2

Dengan menggunakan teknik sparse check out, Anda DAPAT memeriksa file tertentu yang sudah diperiksa atau ada ... dengan trik sederhana:

Setelah checkout dari tingkat atas repositori Anda menggunakan opsi 'item ini saja', di Windows explorer, Anda HARUS klik kanan pada file yang Anda perlu perbarui; pilih Repo Browser di menu konteks; temukan file LAGI di browser repositori, dan klik kanan. Anda sekarang akan melihat "perbarui item untuk direvisi" di menu konteks.

Saya tidak yakin apakah itu fitur tidak berdokumen atau hanya bug. Butuh berjam-jam setelah bekerja untuk akhirnya menemukan trik ini. Saya menggunakan TortoiseSVN 1.6.2.

devXen
sumber
2

Saya ingin checkout satu file ke direktori, yang bukan bagian dari copy pekerjaan.

Mari kita dapatkan file di URL berikut: http: //subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

Jadi saya memeriksa direktori yang diberikan yang berisi file target yang ingin saya tuju ke direktori dummy, (mis. Etcb untuk URL yang diakhiri dengan /etc).

Kemudian saya mengosongkan file .svn / entri dari semua file direktori target yang tidak saya butuhkan, untuk meninggalkan hanya file yang saya inginkan. Dalam file .svn / entri ini , Anda memiliki catatan untuk setiap file dengan atribut-atributnya jadi tinggalkan hanya catatan mengenai file yang ingin Anda dapatkan dan simpan.

Sekarang Anda hanya perlu menyalin lalu '' .svn '' ke direktori yang akan menjadi "copy pekerjaan" baru. Maka Anda hanya perlu:

cp .svn /directory
cd /directory
svn update myfile

Sekarang direktori direktori berada di bawah kontrol versi. Jangan lupa untuk menghapus direktori directoryb yang hanya merupakan '' copy pekerjaan sementara ''.

hendergassler
sumber
Bukankah ini yang jarang dilakukan checkout? Anda benar-benar tidak boleh meretas file di direktori .svn secara manual.
Lasse V. Karlsen
Mungkin tetapi itu memecahkan masalah dengan benar. Saya kira itu, itu cara manajemen versi harus bekerja, juga mampu menangani file sebagai ekstensi direktori. Cobalah dan katakan padaku apa yang salah dengan logika. Saya akan menyarankan tim pengembangan subversi untuk memperluas utilitas svn dengan fitur ini, itu akan menyelesaikan masalah semua orang yang menjawab utas ini.
hendergassler
2

Karena tidak ada jawaban lain yang berfungsi untuk saya, saya melakukannya menggunakan retasan ini:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

Ini akan membuat folder lokal baru yang hanya memiliki file dari jalur jauh. Kemudian Anda dapat melakukan tautan simbolis ke file yang ingin Anda miliki di sini.

Lacho Tomov
sumber
OP bertanya tentang svn cosatu file untuk menghindari seluruh direktori yang penuh dengan file gambar. Juga, menambahkan symlink hanya dapat menambah kompleksitas, bergerak dari direktori temp bisa berfungsi, tetapi Anda masih harus memeriksa seluruh direktori gambar hanya untuk satu gambar. @ steve-jessop punya ide yang tepat
Chris Marotta
2
@ChrisMarotta, OP menanyakan pertanyaan 9 tahun yang lalu. Tidak ada yang menjawab OP. Ini adalah topik umum untuk masalah seperti ini, dan tidak ada hubungannya dengan OP asli lagi. Orang-orang datang ke sini untuk mencari solusi untuk masalah mereka sendiri. Dan ketika mereka membacanya, beberapa dari mereka akan berada dalam situasi saya di mana ini adalah satu-satunya solusi yang tepat. Itu sebabnya saya mempostingnya.
Lacho Tomov
1
Saya senang dengan jawaban ini, itu membantu saya
Leos Literak
1

Masalah ini dicakup oleh:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

Ada skrip terlampir yang memungkinkan Anda memeriksa satu file dari svn, membuat perubahan, dan melakukan perubahan kembali ke repositori, tetapi Anda tidak dapat menjalankan "svn up" untuk checkout sisa direktori. Ini telah diuji dengan svn-1.3, 1.4 dan 1.6.

ddkilzer
sumber
1

Jika Anda hanya ingin mengekspor file, dan Anda tidak perlu memperbaruinya nanti, Anda dapat melakukannya tanpa harus menggunakan perintah SVN.

Menggunakan Browser Repositori TortoiseSVN , pilih file, klik kanan, lalu pilih " Salin URL ke clipboard ". Rekatkan URL itu ke browser Anda, dan setelah login Anda akan diminta dengan unduhan file.

Dengan cara ini Anda juga dapat memilih revisi yang diinginkan dan mengunduh versi file yang lebih lama.

Perhatikan bahwa ini valid jika server SVN Anda memiliki antarmuka web.

Daniel
sumber