Apakah ada perintah Subversion untuk mereset copy pekerjaan?

110

Apakah ada satu perintah Subversion yang akan "mereset" copy pekerjaan persis ke keadaan yang disimpan dalam repositori? Sesuatu seperti git reset --hardatau (ha, hard Git reset juga tidak menghapus file tidak berversi!) rm -rf wc && svn co <url> wc.

Pembaruan: Saya tidak menginginkan pengembalian sederhana, karena itu tidak menghapus file tambahan dalam copy pekerjaan. Saya sangat menginginkan sesuatu yang akan sama dengan menghapus copy pekerjaan dan memeriksanya lagi, hanya tanpa harus mengunduh data lagi. (Jelas saya tidak keberatan kehilangan semua perubahan yang tidak mengikat.)

zoul
sumber
mengembalikan semua perubahan dalam copy pekerjaan?
mauris
5
Anda akan menggunakan git clean -xdfuntuk menghapus hal-hal yang tidak berada di bawah kendali sumber.
vcsjones
1
@vcsjones: Terima kasih, halaman manual untuk git cleankutipan persis apa yang saya cari: "Ini dapat digunakan (mungkin sehubungan dengan git reset) untuk membuat direktori kerja yang murni untuk menguji build yang bersih." Sayangnya Subversion tidak memiliki sesuatu yang seperti ini.
zoul

Jawaban:

180

Anda dapat kembali secara rekursif seperti ini:

svn revert --recursive .

Tidak ada cara (tanpa menulis skrip materi iklan) untuk menghapus hal-hal yang tidak berada di bawah kendali sumber. Saya pikir yang paling dekat yang bisa Anda lakukan adalah mengulang semua file, gunakan lalu grep hasilnya svn list, dan jika grep gagal, maka hapus.

EDIT : Solusi untuk skrip kreatif ada di sini: Hapus file tidak berversi Subversion secara otomatis

Jadi, Anda dapat membuat skrip yang menggabungkan revertdengan jawaban mana pun di pertanyaan terkait yang paling cocok untuk Anda.

vcsjones.dll
sumber
3
Anda mungkin ingin menjalankan svn cleanupwc terlebih dahulu juga. Ini adalah praktik standar saya untuk membersihkan setelah penggabungan yang dibatalkan dan yang lainnya.
Mike Miller
tortoise juga memiliki opsi "hapus file tidak berversi" dalam dialog pembersihan.
v.oddou
2
Akan lebih baik jika "hapus file tidak berversi" tersedia melalui baris perintah. Khusus untuk build otomatis.
C. Tewalt
3
Lihat jawaban saya ... --remove-unversioned ada untuk pembersihan svn
Denny Weinberg
38

Untuk mengembalikan file terlacak

svn revert . -R

Untuk membersihkan file yang tidak terlacak

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

The -rfmungkin / harus melihat menakutkan pada awalnya, tetapi sekali dipahami itu tidak akan untuk alasan ini:

  1. Hanya direktori yang sepenuhnya tidak terlacak akan cocok dengan pola yang diteruskan rm
  2. The -rfdiperlukan, yang lain direktori ini tidak akan dihapus

Untuk mengembalikan lalu bersihkan (pertanyaan OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Untuk kemudahan penggunaan yang konsisten

Tambahkan alias permanen ke .bash_aliases Anda

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'
niklauzg
sumber
cuplikan kedua tampaknya tidak berhasil untuk saya:awk: fatal: error reading input file '-': Input/output error
hbogert
Saya harus melarikan diri dari ?dalam awkperintah, jika tidak maka itu cocok dengan semua baris dalam outputsvn status
gpanders
23

Hapus semua yang ada di dalam salinan lokal Anda menggunakan:

rm -r your_local_svn_dir_path/*

Dan kembalikan semuanya secara rekursif menggunakan perintah di bawah ini.

svn revert -R your_local_svn_dir_path

Ini jauh lebih cepat daripada menghapus seluruh direktori dan kemudian melakukan pembayaran baru, karena file sedang dipulihkan dari data meta SVN lokal Anda. Ia bahkan tidak membutuhkan koneksi jaringan.

Vivek Yadav
sumber
4
jauh lebih cepat adalah pembersihan svn --remove-unversioned.
Znik
7
svn revert . -R

untuk mengatur ulang semuanya.

svn revert path/to/file

untuk satu file

Abe Voelker
sumber
1
Itu tidak menghapus file ekstra tidak berversi dalam copy pekerjaan, bukan?
zoul
@zoul Saya rasa tidak, tapi jangan mengutip saya karena sudah lama sejak saya menggunakan SVN
Abe Voelker
sayangnya itu tidak menyentuh file yang tidak dilacak. coba svn kembali -R your_local_svn_dir_path
Znik
7

Hapus file tidak berversi dan kembalikan setiap perubahan:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Di luar:

D         D:\tmp\sql\update\abc.txt
Denny Weinberg
sumber
1
ini adalah jawaban terbaik, tanpa skrip tambahan. ini universal dan kompatibel dengan banyak versi svn.
Znik
3

Solusi cmd / bat Windows murni:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof
Andriy F.
sumber
2

Hapus copy pekerjaan dari OS dan periksa lagi paling sederhana, tetapi jelas bukan satu perintah.


sumber
Sangat lambat. Itulah mengapa saya mencari cara untuk menyiasatinya.
zoul
1
+1, Ini sering kali menjadi satu-satunya cara untuk memperbaiki masalah aneh, setidaknya yang saya temukan.
Brad
2

Sangat cepat dan sederhana serta melakukan apa yang Anda inginkan

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(Configi>.ini)/ untuk tujuan saya sendiri.

Dan mungkin ide yang bagus untuk menambahkan --no-ignore ke perintah svn

pengguna1299374
sumber
2
Ini sangat buruk. Bagaimana dengan pengguna Windows? Subversion jelas membutuhkan sedikit kerja keras sebelum dapat dianggap serius sebagai alat kontrol versi.
Warren P
1

Untuk menghapus file yang tidak terlacak

Saya dapat membuat daftar semua file yang tidak terlacak yang dilaporkan oleh svn stbash dengan melakukan:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Jika Anda merasa beruntung, Anda dapat mengganti echodengan rmmenghapus file yang tidak terlacak. Atau salin file yang ingin Anda hapus dengan tangan, jika Anda merasa kurang beruntung.


(Saya menggunakan jawaban @ abe-voelker untuk mengembalikan file yang tersisa: https://stackoverflow.com/a/6204601/1695680 )

ThorSummoner
sumber