Mercurial'de kaldırılmış bir dosyayı (varsa) nasıl kurtarabilirim?


101

Yanlışlıkla, CLI yerine bir GUI kullanarak, bir Mercurial projesindeki her dosyayı kaldırdım.

Revert tamam ile iyileştim ve bazı işlerimi kaybettim, zaman makinem olduğu için kolayca geri alabileceğim. Ancak bu tür dosyaları kaldırmanın / geri getirmenin bir yolu var mı? Kılavuzda gezindi ve Google'da arandı ama hiçbir şey göremiyor. Herhangi bir eklenti var mı?

Muhtemelen burada kendi sorumu yanıtlıyorum, ancak dosyalar dizinden gitmiş ve kurtarmak için çöp kutusunda değiller, bu yüzden Kaldır'ın geri alınamaz olduğunu varsayıyorum?

ps Bunu dizinden silmeden hg forgetveya hg remove -Afsilmeden kaldıracağımı biliyorum, ancak sorum eylemi derinlemesine düşünmek yerine yaptığım hatayla ilgili.


1
eski bir revizyonu kontrol edebilmeli ve iyi olmalısın (tabii ki bu sadece geçmişi yeniden
yazmadığın

sorun, taahhüt etmiş olmam, düzenlemeler yapmış olmamdı, R (değiştirilmiş). Yani bu diziden sonra, evet, önceki commit'i aldım, bu yüzden buna geri döndüm ve zaman makinesi biçiminde yedeğim olduğu için, son değişiklikleri daha sonra ekleyebilir ve sonra kaydedebilirdim. Ancak bir geri ödeme yapmasaydım, değişiklikler kaybolacaktı.
PurplePilot

1
Yalnızca dosya adlarında arama yapmanızı sağlayan ilgili soru (hızlı): stackoverflow.com/questions/1013550/…
Michael Pryor

Yanıtlar:


153

İlk olarak, hg grepkurtarmak istediğiniz silinmiş dosyayı bulmak için kullanın . Bu komutun çıktısı size dosyanın bulunduğu son revizyonu ve silinen dosyanın yolunu gösterecektir. İkinci olarak, çalıştırın hg revert -r <revision number> <path to deleted file> Silinen dosya şimdi çalışma kopyanızda olacak ve başa başlanmaya hazır olacaktır.


5
benim için güzel çalıştı, teşekkürler. "Kasten sildiğim bir dosyayı nasıl eski durumuna döndürürüm?" sorusunun yanıtını arıyordu.
nc.

Tutulmadan itibaren bu, Ekip Seçin -> Geri Döndür
Emil 10'13

3
Dosyayı içeren düzeltmeyi bulmanın başka bir yolu dahg log -I '**file.ext'
mpen

2
Bilginize: Dosyayı kaldıran değil , dosyaya sahip olan kaydının revizyon numarasını istiyorsunuz !
Lukas Knuth

8

Yorumdan alıntı:

Bir depo kurdum, hepsini taahhüt ettim, Kaldırdım ve sonra tekrar işledim

Bu durumda, çalışma dizinini önceki revizyona güncellemeniz yeterlidir:

$ hg update -C -r-2

Negatif revizyon numarasını not edin. Sildiğiniz dosyalar önceki revizyonda değilse, bunları kullanarak bulabilirsiniz:

$ hg log -v

5

Bu benim için çalıştı.

hg revert -r revision pathToTheFile

4

Mercurial 1.6 ve üstü için

Silme dosyasının adını biliyorsanız, revizyonunu aşağıdakilerle kolayca bulabilirsiniz:

hg log -r "removes('NAME.c')"

Bu size, NAME.c adlı bir dosya (kökte) silinir cadı içinde revizyon verecektir.

Ardından (diğer yanıtlar gibi) dosyayı önceki revizyona geri döndürebilirsiniz:

hg revert -r <revision number> <path to deleted file>

Bildiğinize uyarlamak için bunun yerine bir dosya adı kalıbı kullanabilirsiniz, örneğin **/NAME.ctüm dizinlerde arama yapmak için kullanabilirsiniz . Bunu Dosya Adı Desenleri'nde okuyabilirsiniz . Ve yeni revset spesifikasyonları hakkında bilgi edinmek için bu bağlantıyı kullanın .


1

Kabul edilen yanıta ek - bir işlemedeki tüm kaldırma işlemlerini geri almak istiyorsanız bu daha hızlıdır. İçinde birkaç yüz dosya bulunan büyük bir klasörü sildim ve yaptım hg addremove, ki bu benim niyetim değildi, bu yüzden tüm bu silme işlemlerini geri almak zorunda kaldım.

Mercurial veri havuzu geçmişinde silinen dosyaları bul özelliğini kullanarak hızlı bir şekilde? + xargs + tr, tüm revizyon -3 kaldırmalarını revizyon -4'ten sürüme geri döndür:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

Dosyalarınızdan herhangi birinin adında boşluk varsa bunun başarısız olacağını unutmayın; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html şu anda {file_dels}bölünmüş herhangi bir şablona sahip görünmüyor \n.


0

İle bir depodaki son taahhüdü geri alabilirsiniz hg rollback. Yalnızca tek bir geri alma düzeyi vardır, bu nedenle kaldırmayı birden fazla kaydetme ile yaptıysanız, bu, değişikliğinizi tamamen geri almaz. Bu yalnızca yerel deponuzda çalışır, bu nedenle zorladıysanız, uzak depoda geri alamazsınız.


1
Hayır bu çalışmıyor. Mercurial Dağıtılmış SCM'ye sahip bir Mac kullanıyorum (sürüm 1.4.1 + 20091201). Bir depo kurdum, tümünü işledim, Kaldırıldı ve sonra tekrar işledim, ancak bu yalnızca R (kaldırılmış) olarak işaretlenmiş dosyaların bir listesini geri getiriyor, ancak aslında dosyaları geri getirmiyor. Dosyaları R (değiştirilmiş) ve Geri Al olarak işaretlersem hiçbir şey yapmadan önce de olmaz.
PurplePilot

Hg geri alma işlemini yaptıktan sonra, deponuz geri alınacak, ancak mevcut çalışma dizininizde yine de değişiklikleriniz olacaktır. Hg'ye geri alınan revizyon için temiz bir güncelleme yapmasını söyleyin, şimdi ipucunda: hg up -C.
ataylor

1
hg rollbackdosyanın silinmesi commit işleminin bir parçası olmadığından kaldırılan dosyayı kurtarmaz.
mrucci

4
Doğru. Kaldırma işleminden önce yapılmamış düzenlemelere ulaşmak istiyorsanız, bunlar kaybolur.
ataylor

0

hg stripMq (Mercurial Queues) uzantısı tarafından sağlanan komutu kullanarak tamamlanmış revizyonları kaldırabilirsiniz . Bu size dosyalarınızı geri vermelidir.

Bunu denemeden önce bir yedekleme yapın, çünkü Mercurial'in değişiklik setleri veritabanını değiştirecektir.


0

Aşağıdaki yöntem basittir ve o kadar aptalca ki yanlış gidemez. Birden fazla dosyayı sildiyseniz veya yeniden adlandırdıysanız, sorun olmayacaktır.

hg clone mydirectory mydirectory1

ve şimdi mc'yi (veya Far Manager'ı) başlatır ve ne olduğu ile ne hale geldiğini karşılaştırırsınız.

tamamlandığında, sadece silin mydirectory1.


0

Aşağıdakiler benim için çalıştı.

hg revert -r <Revision Number> <File Name>

(İsteğe bağlı, tüm dosyaları geri döndürmek için)

hg revert -r <Revision Number> --all
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.