Tüm yerel değişiklik kümelerini silin ve ağaca dönün


95

Mercurial kullanıyorum ve yerel olarak üç başlı korkunç bir karmaşa yaşadım. Zorlayamıyorum ve sadece tüm yerel değişikliklerimi ve taahhütlerimi silmek ve tamamen temiz bir kod ve temiz bir geçmişle yeniden başlamak istiyorum.

Başka bir deyişle, (a) uzak dalın ucunda bulunan yerel olarak tam olarak aynı kodla ve (b) herhangi bir yerel işlemin geçmişiyle sonuçlanmamasını istiyorum.

hg update -CYerel değişikliklerin üzerine yazdığını biliyorum . Ancak herhangi bir yerel taahhüdü nasıl silerim?

Açık olmak gerekirse, yerel olarak yaptığım işlerin hiçbirini korumakla ilgilenmiyorum. Tamamen temiz bir yerel kasaya geri dönmenin en basit yolunu istiyorum.


Yanıtlar:


129

En basit yol (yeni hg clone) pratik olmadığında, kullanıyorum hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

hg outgoingSessiz kalana kadar tekrarlayın . Unutmayın ki hg strip $revyok eder $revve onun tüm torunları.

Öncelikle stripMercurial ayarlarınızdan etkinleştirmeniz gerekebileceğini unutmayın .

Not: Daha akıllı bir yaklaşım, revset dilini kullanmak ve şunları yapmaktır:

% hg strip 'roots(outgoing())'

1
Teşekkür ederim! Bunun mükemmel bir şekilde çözüldüğü bir duruma düştüm, hiçbir sorun yaşamadım.
eswald

1
Bu beni yukarıdaki büyük düzeltmelerden kurtardı, çok basit, teşekkürler!
David C

3
Kimsenin hg strip 'roots(outgoing())'tanımadığı için işe gitmekte sorun yaşıyorsa 'roots(outgoing())'. Onunla çalışmasını başardım hg strip "roots(outgoing())".
jsea

@SombreErmine cmd.exe, evet.
sadece birisi

21

Yalnızca uzak depoda bulunan değişiklik setlerini sakladığınız yerel bir klon yapmak isteyeceksiniz. Kullanım TortoiseHg , hg logya şekle benzer düzeltmelerinizin hangi bunu en son revizyon olan vermedi yapmak (başlamış karmaşa önce bir tane). Kullanmak hg outgoingburada yardımcı olabilir - yaptığınız tüm değişiklik setlerini listeleyecektir - bunlardan herhangi birinden daha önce bir revizyon numarası seçin.

Hedef revizyon çağrılırsa goodve klonunuz çağrılırsa foo, şunu yapın:

hg clone -r good foo foo-clean

Bu hızlı, yerel bir işlem olacaktır - her şeyi tekrar indirmek için hiçbir neden yoktur . foo-cleanKlon sadece revizyon kadar changesets içerecektir good. Artık yerini alabilir foo-clean/.hg/hgrcile foo/.hg/hgrcböyle varsayılan itme / çekme yolu olarak depo-yerel ayarları korumak için.

Bunu tatmin edildiğinde foo-cleansize ihtiyacınız olan her şey var foo, o zaman sadece silmek foove yeniden adlandırmak foo-cleaniçin foo. Bir Do hg pullsizin klon içine uzaktan deposundan herhangi bir yeni changesets almak ve normal gibi devam etmek.


Kimse uzak depoya yeni değişiklik setlerini göndermediyse, hangi revizyonu kullanmak istediğinizi belirlemek çok basittir good: hg id defaultsize uzak depodaki ipucunun kimliğini söyleyecektir.


Aynı durumu yaşıyorum, ama aynı zamanda repo dizininde çok fazla dosya var ama hgignore'da. Hg şeridi kurulamıyor ve tüm klonu değiştirmeden yerel taahhütleri iptal etmek istiyor. Herhangi bir fikir? - Ah! Herhangi bir dosya eklemediysem, diğer klonu eski dizinime kopyalayabilirim !?
Peteter

Yine de birden fazla dalınız varsa bu yönteme dikkat edin. Belirli bir revizyona kadar klonlama, yalnızca belirtilen revizyonun dalındaki değişiklik kümelerini alır. Daha sonra hg pull -rher ek dalın son "iyi" revizyonunu yapmanız gerekebilir .
Yitz

9

Tamam. Bu yüzden tüm yerel öğeleri, hg inityeni yerel depoyu ve sahip olduğunuz hg pullen son ipucunu silin . Bundan hg updatesonrasını unutma .


Teşekkürler. 'Tüm yerel şeyleri sil' dediğinizde, tüm depoyu mu yoksa sadece değişikliklerimi mi siliyorsunuz? Hg init ne işe yarar (Googled ama basit bir açıklama göremiyorum) ve onunla herhangi bir işaret kullanmam gerekir mi? Mercurial .hgrc tercihlerim gibi şeyler silecek mi?
Richard

Güncelleme: proje kök dizinindeki her şeyi silersem, sonra 'hg init' yazarsam, 'abort: repository alırım. zaten var!'. Yeni bir dizin kurmam ve çalışmam gerekiyor mu? Mümkünse yapmamayı tercih ederim ... elbette yerel olarak yaptığım her şeyi öldürmenin basit bir yolu olmalı ?!
Richard

Evet, tüm arşiv öğeleri dahil her şeyi silin. Yeni, temiz bir klasörden başlayın. Tercihlerinizi yedekleme dosyasına kaydedebilir ve sonra bunları hg init havuz adı ile oluşturduğunuz yeni depoya geri yükleyebilirsiniz. İnit
alemjerus

6
alemjerus: hg init+ hg pull= hg cloneAradaki fark, sizin için hg clonegüzel bir .hg/hgrcdosya oluşturması ve hg cloneaynı dosya sistemi üzerinde klonlarken yer kazanmak için sabit bağlantıları kullanmasıdır.
Martin Geisler

Richard: Çıktı hg help initburada: selenic.com/mercurial/hg.1.html#init Ama belki bu çok kısa? Daha fazla yardıma ihtiyacınız olursa lütfen posta listemize bir posta gönderin! Bakınız: mercurial.selenic.com/wiki/MailingLists
Martin Geisler

5

Kullanabilirsin

hg şerit revizyonu

yerel deponuzdaki herhangi bir revizyonu ve alt ağacını öldürmek için.

https://www.mercurial-scm.org/wiki/Strip

Ancak onu zaten itilmiş herhangi bir şey için kullanmaya çalışmayın.


Bunu genel bir revizyonda kullanabilirsiniz, ancak tekrar çekerseniz, yeniden görünecektir. (hg şeridi yalnızca yerel depoda çalışır.)
Mike Rosoft

2

Yerel sisteminizdeki her şeyi silin ve uzak depoyu yeniden klonlayın.


2
hg şerit "hg out --template" {rev} {yazar} \ n "| grep YOUR_AUTHOR_NAME | kes -d "" -f 1`

hile benim için yapar.

Yazar adınızla oluşturulan varsayılan depoya gönderilmeyen tüm revizyonları çıkarır.

Bu stili, varsayılan depo ile değil başka bir Depo ile kontrol etmek için de kullanabilirsiniz.

hg strip `hg out OTHER_REPO_ALIAS - şablon" {rev} {yazar} \ n "| grep YOUR_AUTHOR_NAME | kes -d "" -f 1`

0

TortoiseHg kullanıyorsanız, (küçük) bir karmaşadan kurtulmanın basit bir yolu, önce en son revizyona güncelleme yapmak, ardından değişiklik kümelerinizi seçmek ve "yerel ile birleştirme" yi başlatmaktır. Birleştirme diyaloğu göründüğünde, bazı ekstra seçenekleri ortaya çıkarmak için küçük '+' simgesine tıklamanız yeterlidir, bunlardan biri "birleştirme hedefi (diğer) revizyonundaki değişiklikleri at" dır. Bunu yapmak, değişiklik kümelerinizin hala depoda olacağı ve itileceği anlamına gelir, ancak birleştirme sırasında atılacakları için hiçbir etkisi olmayacaktır. Birçok kafayı kapsayan çok sayıda değişiklik kümeniz varsa, depoyu bu şekilde kirletmek istemeyebilirsiniz, ancak bu basit bir düzeltme ve attığınız değişiklik kümelerinin daha sonra başvurmak isteyebileceğiniz veriler içerip içermediğini dikkate almaya değer.

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.