Bagaimana cara menghapus semua file yang tidak terlacak dari direktori kerja saya di Mercurial?

207

Apakah mungkin untuk menghapus semua file yang tidak terlacak dari direktori kerja saya? Katakanlah saya menambahkan banyak file ke direktori kerja saya, tidak menambahkannya melalui 'hg add' dan sekarang ingin menyingkirkan file-file baru sepenuhnya?

Saya menggunakan windows, meskipun saya menggunakan PowerShell, jadi solusi gabungan juga dimungkinkan di sini.

Valentin Vasilyev
sumber

Jawaban:

286

Tambahkan Ekstensi Mercurial yang disebut purge . Ini didistribusikan oleh Mercurial.

Ekstensi ini menambahkan perintah "pembersihan" ke "hg" yang menghapus file yang tidak dikenal oleh Mercurial. yaitu File yang tidak terlacak. Jadi perintahmu adalah,

hg purge

Ini tidak diaktifkan secara default, mungkin untuk menghindari menghapus file yang Anda lupa tambahkan secara tidak sengaja.

Untuk menginstal ekstensi ini, tambahkan ini ke file pengaturan mercurial Anda (.hgrc pada Unix, Mercurial.ini di Windows)

[extensions]
purge = 

Untuk mengaktifkan ekstensi ini sementara Anda dapat menggunakan

hg purge --config extensions.purge= 
cukup keras
sumber
26
hg purge --allakan menghapus semua file yang tidak dilacak dan diabaikan. Ini berguna untuk membersihkan build in-source
tacaswell
22
untuk mengaktifkan ext sementara Anda dapat menggunakanhg purge --config extensions.purge=
Pykler
121

Cara yang tepat tanpa pembersihan adalah:

hg st -un0 | xargs -0 rm
tonfa
sumber
1
@implyharsh adalah cara ini lebih baik atau apakah Anda hanya merasa kurang bekerja daripada menambahkan ekstensi?
Yaakov Kuperman
3
@YaakovKuperman Saya kira menambahkan ekstensi kurang berfungsi daripada perintah ini (satu kali mengaktifkan). Saya tidak mengaktifkan ekstensi pembersihan karena saya membutuhkannya kurang dari sekali dalam dua minggu. Juga panggil saya konyol tetapi, mengetik perintah ini memberi saya cukup waktu untuk berpikir lagi sebelum melakukan sesuatu yang merusak seperti 'membersihkan'.
simplyharsh
2
@implyharsh, itu masuk akal, tapi ada dua alasan saya pergi untuk membersihkan semuanya. Pertama, Anda dapat melakukan pembersihan - cetak dan melihat daftar apa yang akan dihilangkan sebelum Anda melakukan pembersihan. Kedua, jika Anda melakukannya dengan cara ini, Anda harus berada di root repo agar bisa berfungsi.
Yaakov Kuperman
1
@javawizard: Ini bagus yang membuat saya memikirkan kembali bagaimana hg bekerja. Namun, ini hanya berfungsi karena rm -rf *melewatkan file dot dan direktori dot, termasuk .hg/. Dengan cara yang sama, dotfile lain (katakanlah .evil-settings) juga akan bertahan dan membersihkan lebih baik.
dirkjot
2
Ketahuilah bahwa ada perbedaan perilaku antara apa yang ditemukan oleh 'hg st -u' dan 'hg purge'. 'hg st -u' TIDAK AKAN menemukan direktori kosong yang tidak terlacak, sementara 'hg membersihkan' AKAN menemukan (dan menghapus) mereka. Itu mungkin atau mungkin tidak penting bagi Anda.
Michael Kent
19

Terima kasih! Ini bekerja untuk saya juga di Powershell:

hg st -un | rm
Nikolaos Georgiou
sumber
2
xargs tidak bekerja di PowerShell - ini adalah satu-satunya jawaban yang keluar dari kotak "windows friendly"
Nikos Athanasiou
setuju ... kedua di xargs tidak bekerja di PowerShell ... pembersihan masih merupakan opsi yang layak,
beauXjames
Bekerja untuk saya :)
Naveen Kumar V
4
rm $(hg st -u)

... di mana -u berarti "tidak terlacak", Anda juga dapat memilih negara bagian lain.

Alex
sumber
4

Kamu bisa memakai

hg purge --all

untuk menghapus semua file yang diabaikan dan tidak terlacak

(pertama Anda perlu menginstal ekstensi pembersihan seperti yang dijelaskan dalam beberapa jawaban)

Alex L
sumber
3

Coba ikuti:

hg st -un | xargs rm
Alexei Tenitski
sumber
2

Ini harus melakukan trik:

hg status | grep '^\?' | sed 's/^\? //' | xargs rm -rf
Kristian
sumber
2

jika Anda tidak ingin menggunakan pembersihan:

rm $(hg st | grep ^? | awk '{print $2}')
Im
sumber
0

Dengan asumsi bahwa Anda menggunakan sistem * nix, Anda dapat menjalankan sesuatu seperti ini:

rm `hg st | awk '/\?/ {print $2}'`

dari akar repositori lincah.

Saya tidak tahu tentang perintah lincah standar untuk mencapai hal yang sama tetapi saya percaya ada banyak opsi baris perintah untuk melakukan ini. Saya yakin ada solusi "lebih baik" dan akan tertarik untuk mendengar saran lain.

Silakan gunakan perintah ini dengan hati-hati karena tidak diuji secara menyeluruh.

Filter Heinrich
sumber
0

Ini bekerja dari baris perintah Windows 10 (tentu saja digunakan dengan hati-hati):

for /f %g in ('hg status -un') do @echo %g & @del %g
Dave Cousineau
sumber