Buang semua dan dapatkan salinan bersih dari revisi terbaru?

159

Saya sedang memindahkan proses pembangunan untuk menggunakan lincah dan ingin mendapatkan direktori kerja kembali ke keadaan revisi tip. Proses proses build sebelumnya akan memodifikasi beberapa file dan menambahkan beberapa file yang tidak ingin saya komit, jadi saya memiliki perubahan lokal dan file yang tidak ditambahkan ke repositori.

Apa cara termudah untuk membuang semua itu dan mendapatkan direktori kerja bersih yang memiliki revisi terbaru?

Saat ini saya sedang melakukan ini:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

tapi sepertinya harus ada cara yang lebih sederhana.

Saya ingin melakukan hal yang sama dengan menghapus repo, melakukan klon baru, dan pembaruan. Tetapi repo itu terlalu besar untuk bisa cukup cepat.

Rory
sumber
1
Apakah "(hapus konten ...)" komentar pada perintah "kembalikan - semua" atau langkah yang Anda lakukan? Saya bertanya karena "pembaruan hg" hanya akan memperbarui file yang berubah. Jika Anda menghapus file lain sebelum memperbarui, Anda tidak akan mendapatkannya kembali kecuali Anda memperbarui kembali ke revisi-nol ( hg update 00) dan kemudian kembali ke ujung. Mengapa tidak hg revert --allcukup untuk kembali ke status folder kerja yang konsisten sebelum menarik dan memperbarui?
Lasse V. Karlsen
ini adalah langkah terpisah yang dilakukan dengan perangkat lunak build saya. (Saya bisa saja menggunakan penghapusan baris perintah, tetapi tidak.)
Rory
1
Anda mungkin menemukan archiveperintah itu berguna di masa depan. Misalnya, Anda bisa hg archive ../newbuild, dan snapshot repositori Anda pada akhirnya hg updateakan ditempatkan di sana. Saya biasanya melakukan itu untuk membangun malam jadi saya tidak mengambil risiko mengacaukan repo saya. Hapus saja direktori build ketika Anda tidak lagi membutuhkannya.
Pos Tim

Jawaban:

212

Langkah-langkah tersebut harus dapat dipersingkat menjadi:

hg pull
hg update -r MY_BRANCH -C

The -Cflag mengatakan perintah update untuk membuang semua perubahan lokal sebelum memperbarui.

Namun, ini mungkin masih meninggalkan file yang tidak terlacak dalam repositori Anda. Sepertinya Anda ingin menyingkirkannya juga, jadi saya akan menggunakan purgeekstensi untuk itu:

hg pull
hg update -r MY_BRANCH -C
hg purge

Bagaimanapun, tidak ada satu perintah tunggal yang dapat Anda minta Mercurial untuk melakukan yang akan melakukan semua yang Anda inginkan di sini, kecuali jika Anda mengubah prosesnya menjadi metode "kloning penuh" yang Anda katakan tidak dapat Anda lakukan.

Lasse V. Karlsen
sumber
6
Terima kasih, itu adalah 'pembersihan' yang saya butuhkan. Pembaruan -C tidak menghilangkan file yang tidak terlacak, yang merupakan hal utama yang saya perjuangkan.
Rory
4
Anda dapat menggunakan TortoiseHg untuk membersihkan juga. Anda hanya perlu mengaktifkan ekstensi di pengaturan meja kerja (atau edit mercurial.ini).
Dave
18
Jika ekstensi pembersihan tidak diaktifkan, Anda juga dapat menggunakan perintah seperti ini: hg --config "extensions.purge=" purge --all
Samuel Delisle
5
@ csharptest.net hg purge --allhanya memberi saya sakit kepala yang baik, karena itu juga menghapus konfigurasi lokal saya, yaitu: pengguna basis data / kata sandi dll :)
VMC
@SamuelDelisle terima kasih tuan yang baik, saya tidak ingin melakukan perubahan konfigurasi hanya untuk perintah satu kali ini dalam skrip saya!
joonas.fi
113
hg up -C

Ini akan menghapus semua perubahan dan memperbarui ke kepala terbaru di cabang saat ini.

Dan Anda dapat mengaktifkan ekstensi pembersihan untuk dapat menghapus semua file yang tidak berversi juga.

zerkms
sumber
Apakah itu termasuk file yang tidak dilacak? Saya memiliki beberapa masalah dengan perintah-perintah lain yang saya coba. Saya akan mencobanya sekarang ...
Rory
7
@Rory: nggak, hg purgeuntuk file yang tidak berversi.
zerkms
10

Untuk menghapus tidak terlacak pada * nix tanpa ekstensi purge yang dapat Anda gunakan

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

Yang menggunakan

perbarui -r --rev REV revisi

update -C --clean buang perubahan yang tidak dikomit (tidak ada cadangan)

status -u --unknown hanya menampilkan file yang tidak dikenal (tidak dilacak)

status -n --tidak ada status sembunyikan awalan status

KCD
sumber
4

Jika Anda mencari metode yang mudah , maka Anda mungkin ingin mencoba ini.

Saya sendiri tidak dapat mengingat commandlines untuk semua alat saya, jadi saya cenderung melakukannya menggunakan UI:


1. Pertama, pilih "komit"

Melakukan

2. Kemudian, tampilkan file yang diabaikan. Jika Anda memiliki perubahan yang tidak dikomit, sembunyikan.

Tampilkan file yang diabaikan

3. Sekarang, pilih semuanya dan klik "Delete Unversioned".

Hapus mereka

Selesai Ini adalah prosedur yang jauh lebih mudah diingat daripada hal-hal commandline.

bytecode77
sumber
Saya tidak yakin (saya menggunakan SourceTree sendiri), tetapi tangkapan layar ini tampaknya berasal dari TortoiseHg Workbench. Secara umum, saya pikir solusi berbasis UI sangat membantu, tetapi jawaban ini perlu pelabelan yang lebih baik. Juga, "sembunyikan mereka" terdengar agak kabur bagi saya.
Jon Coombs
3

Status hg akan menunjukkan kepada Anda semua file baru, dan kemudian Anda bisa rm mereka.

Biasanya saya ingin menyingkirkan file yang diabaikan dan tidak berversi, jadi:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

Dan kemudian ikuti itu dengan:

hg update -C -r xxxxx

yang menempatkan semua file versi dalam kondisi yang tepat untuk revisi xxxx


Untuk mengikuti tradisi Stack Overflow mengatakan kepada Anda bahwa Anda tidak ingin melakukan ini, saya sering menemukan bahwa "Opsi Nuklir" ini telah menghancurkan hal-hal yang saya pedulikan.

Cara yang tepat untuk melakukannya adalah memiliki opsi 'jadikan bersih' dalam proses build Anda, dan mungkin juga 'make reallyclean' dan 'make distclean' juga.

John Lawrence Aspden
sumber