Mengembalikan file tunggal dalam SVN ke revisi tertentu

182

Saya memiliki file seperti yang ditunjukkan di bawah ini dalam repo SVN yang ingin saya kembalikan ke versi sebelumnya. Apa cara untuk melakukan ini di SVN? Saya hanya ingin menurunkan versi file ini ke versi yang lebih lama, bukan seluruh repo.

Terima kasih.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial
Gökhan Sever
sumber
ketika Anda mengatakan kembali, apa yang Anda maksudkan, 7 tahun yang lalu, lol
Kalpesh Soni

Jawaban:

181

Jika Anda hanya ingin file lama di copy pekerjaan Anda:

svn up -r 147 myfile.py

Jika Anda ingin mengembalikan , lihat ini " Bagaimana mengembalikan ke versi yang lebih lama dari kode kami dalam subversi? ".

Eric Hauser
sumber
8
tetapi pada saat Anda memperbarui itu mendapat file yang tidak Anda inginkan kembali ...: S
andygoestohollywood
2
jika Anda tidak menginginkannya kembali, svn melakukan file itu, untuk memasukkan versi yang Anda inginkan ke dalam repo
Packet Tracer
14
Ini mungkin tidak benar-benar melakukan apa yang diinginkan penanya. Menggunakan ini, copy pekerjaan bersih dan tidak dapat dilakukan SEBAGAIMANA ADANYA, dan "pembaruan svn" tanpa nomor versi yang ditentukan akan mengambil versi terbaru yang tidak diinginkan.
CXJ
1
Bagaimana saya bisa mengkomit file yang dikembalikan?
marcio
2
Ini tidak benar karena, seperti CXJ menyebutkan, tidak ada cara untuk melakukan file yang diperbarui. Anda mungkin ingin melakukan seperti yang dikatakan Mitch Dempsey (perhatikan, - kekuatan untuk menimpa file): svn export - force -r 147 myfile.py myfile.py
avejidah
76

svn cat juga membutuhkan revisi!

svn cat -r 175 mydir/myfile > mydir/myfile

Tidak pernah tidur lagi
sumber
20
Sejauh ini, inilah jawaban terbaik di halaman ini. Itu meninggalkan file yang diubah dalam keadaan yang dapat dilakukan.
dotancohen
ini tampaknya tidak berfungsi ketika Anda menempelkan ke file baru
ahnbizcad
haha melihat kembali, idk konteks apa yang saya pikirkan ketika saya memposting. Saya tidak ingat. Tampaknya tidak masuk akal.
ahnbizcad
Ini sederhana dan mudah untuk ketika Anda hanya ingin membatalkan perubahan Anda dan mendapatkan file kembali ke keadaan pra-komit tanpa teknis kontrol versi.
Anonim
57
svn revert filename 

ini harus mengembalikan satu file.

bintang
sumber
4
Ada apa dengan semua jawaban lain dengan perintah yang lebih panjang? Terima kasih.
masterxilo
Sama sama. Saya tidak tahu ada apa dengan jawaban lain .. lol
thestar
13
Ini kembali ke revisi yang mana? Doc mengatakan ganti saja dengan repo terbaru. Pertanyaannya adalah bagaimana mengembalikan ke versi sebelumnya.
tgkprog
1
Ini kembali ke versi repo terbaru. Jika Anda membaca deskripsi pertanyaan, sepertinya dia sedang mencari cara mengembalikan satu file, bukan seluruh direktori.
thestar
5
Saya percaya semua ini dilakukan adalah menghancurkan copy pekerjaan Anda dengan 'mengembalikan' itu kembali ke kepala. Atau yang pernah diperiksa. konfirmasi dengan melakukan pembaruan svn -r file VER, kemudian lakukan svn kembali.
Gerard ONeill
50

Untuk satu file, Anda dapat melakukan:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Anda bisa melakukannya svn revert <file>tetapi itu hanya akan mengembalikan copy pekerjaan terakhir.

Mitch Dempsey
sumber
2
ekspor, lalu tempel ke salinan lokal Anda, lalu komit lagi?
tgkprog
1
@ tgkprog itu salah satu cara untuk melakukannya, ya
Mitch Dempsey
@ tgkprog dan apa cara "disukai"?
hbogert
Tidak tahu tapi itu yang berhasil bagi saya: diekspor melewati revisi. Dibuka pada notepad, disalin, disisipkan ke file yang berfungsi. Berkomitmen untuk memimpin dengan komentar di mana rev dan mengapa. Alat UI mungkin memiliki cara yang lebih baik.
tgkprog
21

Sejauh ini semua jawaban di sini tampaknya memiliki kelemahan yang signifikan, rumit (perlu menemukan URI repo) atau mereka tidak melakukan apa yang mungkin ditanyakan oleh pertanyaan: Bagaimana mendapatkan Repo dalam keadaan kerja lagi dengan versi yang lebih lama dari file .

svn merge -r head:[revision-number-to-revert-to] [file-path]adalah IMO cara paling bersih dan paling sederhana untuk melakukan ini. Harap dicatat bahwa mengembalikan file yang dihapus tampaknya tidak berfungsi seperti ini [1]. Lihat juga pertanyaan berikut: Cara yang lebih baik untuk kembali ke revisi SVN file sebelumnya?

[1] Untuk yang Anda inginkan svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up, lihat juga Apa cara yang benar untuk mengembalikan file yang dihapus dari SVN?

Michel Müller
sumber
Saya ingin berkomentar bahwa setidaknya untuk versi Subversion saya, svn mergetidak mengambil banyak file sebagai argumen karena alasan tertentu. Dalam hal ini sepertinya tidak melakukan apa-apa (tanpa pesan kesalahan).
Wrzlprmft
Tetapi perintah saya masih bekerja dengan mengulanginya untuk setiap file, kan?
Michel Müller
Ya, memang.
Wrzlprmft
1
Setuju bahwa ini adalah yang terbersih.
KevinG
13

Cara terbaik adalah:

svn merge -c -RevisionToUndo ^/trunk

Ini akan membatalkan semua file revisi daripada hanya mengembalikan file yang Anda tidak suka membatalkan. Jangan lupa tanda hubung ( -) sebagai awalan untuk revisi.

svn revert File1 File2

Sekarang komit perubahan kembali.

khmarbaise
sumber
9

Anda ingin melakukannya

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Setelah Anda melakukannya, Anda akan memiliki revisi file itu dalam keadaan yang dapat ditagih. Komit file.

Jennifer Elyse
sumber
7

Saya menemukan itu mudah untuk melakukan ini melalui svn catperintah sehingga Anda bahkan tidak perlu menentukan revisi.

svn cat mydir/myfile > mydir/myfile

Ini mungkin tidak akan memerankan data inode (metadata) seperti cap waktu.

Joseph Coco
sumber
kemudian komit file itu ke repo
tgkprog
3
Ini bekerja untuk saya lebih baik daripada memperbarui. Karena pembaruan tidak memungkinkan Anda melakukan modifikasi yang dibuat untuk file itu. (svn 1.8.3)
fe_lix_
7

Terkejut tidak ada yang menyebutkan ini

tanpa mengetahui nomor revisi yang dapat Anda tulis ini, jika Anda baru saja melakukan sesuatu yang ingin Anda kembalikan, ini tidak akan berfungsi jika Anda mengubah beberapa file lainnya dan file target bukanlah file yang terakhir diubah

svn merge -r HEAD:PREV file
Kalpesh Soni
sumber
jika Anda memiliki komentar, silakan diskusikan di sini sebelum melakukan pengeditan?
Kalpesh Soni
1
Tidakkah skenario dalam pertanyaan tersebut memerlukan penggabungan terbalik dari perubahan terbaru, sehingga kita harus menerapkan perubahan yang diperlukan untuk beralih dari HEAD ke PREV?
Nick Russo
4
Perintahnya harus svn merge -r HEAD:PREV fileseperti yang dikatakan @Nick Russo
Heinz
4

Jika hanya beberapa file, dan jika Anda menggunakan Tortoise SVN, Anda dapat menggunakan pendekatan berikut:

  1. Klik kanan pada file sumber Anda, dan pilih "TortoiseSVN" -> "Tampilkan log".
  2. Klik kanan pada revisi di log, dan pilih "Simpan revisi ke ...".
  3. Biarkan revisi lama menimpa file Anda saat ini.
  4. Mengkomit file sumber yang ditimpa.
Elling
sumber
Ini menyimpan file tidak berversi baru seperti file-xxxx di mana xxxx adalah nomor revisi lama. Apa yang akan kita lakukan selanjutnya? hapus revisi baru (mis. KEPALA), ganti nama file baru, tambahkan, komit?
Heinz
Tidak, jangan simpan dengan nomor revisi di nama file. Simpan dengan nama file yang persis sama dengan versi file yang sama saat ini (dengan kata lain, tidak ada xxxx dalam nama file). Kemudian lakukan komit biasa setelah itu.
Elling
4

Hanya menambahkan jawaban @Mitch Dempsy karena saya belum memiliki cukup rep untuk berkomentar.

svn export -r <REV> svn://host/path/to/file/on/repos --force

Menambahkan --force akan menimpa salinan lokal dengan ekspor dan kemudian Anda dapat melakukan svn commit untuk mendorongnya ke repositori.

Kristina
sumber
dan ini adalah jawaban terbaik :)
Zgr3doo
mengapa ini jawaban terbaik? itu tidak mengelola sejarah "cara svn"
Jason S
2

Opsi alternatif untuk satu file adalah "mengganti" versi file saat ini dengan revisi yang lebih lama:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Ini memiliki fitur tambahan bahwa perubahan yang tidak diinginkan tidak muncul dalam log untuk file ini (mis. Svn log file.ext).

Robert Leland
sumber
1

Jika Anda ingin memutar kembali file individual dari revisi tertentu dan dapat melakukan, maka lakukan:

svn merge -c - [OldRev #] [Nama file]

yaitu. svn merge -c -150 myfile.py

Perhatikan negatif pada nomor revisi

Olmstov
sumber
-1
sudo svn revert filename

ini adalah cara yang lebih baik untuk mengembalikan satu file

mallikarjun SK
sumber
2
Saya sangat berharap Anda tidak pernah mendekati mesin produksi dengan izin sudoer.
David Lakatos