Mercurial ile, bir dizi değişiklik setini itmeden önce nasıl tek bir değişiklik setine "sıkıştırabilirim"?


96

Diyelim ki yerel ve uzak bir Mercurial depom var. Şimdi bir özellik üzerinde çalışmaya başlıyorum. Üzerinde çalışıyorum ve bittiğini düşündüğümde değişiklik setini uyguluyorum. Biraz daha test ederek, koddaki bir şeyi değiştirerek bu özelliği daha da geliştirebileceğimi görüyorum. Değişikliği yaparım ve taahhüt ederim. 20 dakika sonra, bu yeni özellikte bir hata olduğunu fark ettim, bu yüzden onu düzeltirim ve bunu da taahhüt ederim.

Şimdi, örneğin, "Uygulama özelliği X" mesajı ile bir değişiklik seti olarak uzak depoya göndermek istediğim 3 değişiklik setim var.

Bunu fazla güçlük çekmeden nasıl yapabilirim? Yamalarla yapabileceğime inanıyorum ama bu çok iş gibi görünüyor.


40
Açıkçası, sizi değişiklik kümelerinizi sıkıştırmaya çalışmaktan vazgeçirmek benim görevim değil, ancak sürüm kontrolünün değerinin yarısının, aylar ve yıllar sonra "neden" değil, "neden" yanıtını verdiğini düşünmek isteyebilirsiniz. Bir özelliğin nasıl ortaya çıktığının ve hangi aşamalarda geleceğin değeri olabileceğinin doğru bir temsili. Bunu atmak öyle görünüyor ki ... kontrolsüzce.
Ry4an Brase

Bu başka bir soruya yol açıyor ... 'histedit' ve 'çöküş' arasındaki fark nedir
sylvanaar

1
collapse, histedit'in özelliklerinin bir alt kümesini sağlar ve histedit'in çok daha sezgisel bir UX'i vardır.
Stefan Rusek

1
Ayrıca, birleştirilmiş değişiklik kümesi mesajını düzenlemek için bir mekanizma sağlar.
Stefan Rusek

1
@ Ry4an: Aslında, ezme / daraltma bazı durumlarda sürüm kontrolüne alaka katar. Ezmeden, her gün özelliklerle veya hata düzeltmeleriyle ilgisi olmayan, ancak kodu dizüstü bilgisayardan masaüstüne veya tersi yönde taşımak için olan iki işlemim olur. Sadece sürüm geçmişine gürültü eklerler.
John Reynolds

Yanıtlar:


39

Collapse Extension'a ne dersiniz ?


20
Gelecekten selamlar! Ben sadece aynı işlevsellik için googledim ve görünüşe göre bugünlerde hg bunu kutunun dışında destekliyor hg rebase --collapse. Rebase komutundaki hg wiki'ye bakın. Bu soru 3. genel arama sonucu ve stackoverflow'daki ilk soru olduğu için bilginin yararlı olabileceğini düşündüm.
a.peganz

1
Gelecekte daha da ileri gelen selamlar !! Yeniden temelli uzantı, yalnızca değişiklik kümelerini bir şubeden diğerine taşımayı hedefliyor gibi görünüyor. Evet, bir --collapse seçeneği vardır, ancak yine de yalnızca bir dizi değişiklik kümesini dallar arasında taşırken uygulanabilir görünmektedir. Bkz. < Mercurial-scm.org/wiki/… >
Brad Oestreicher

3
Sen kullanabilirsiniz hg rebaseile --collapsetek dal içinde.
UuDdLrLrSs

52

Histedit uzatma Aradığınız tam olarak ne olduğunu.

hg histedit -o

veya

hg histedit --outgoing

giden değişiklik kümelerinin bir listesini getirecektir. Listeden yapabilirsin

  • Tek bir değişiklik kümesi oluşturan 2 veya daha fazla değişiklik kümesini katlayın
  • Değişiklik setlerini geçmişten kaldırarak bırak
  • Değişiklik kümelerini istediğiniz gibi yeniden sıralayın.

histedit, öntanımlı olarak "\ n *** \ n" onları ayırarak iki mesaj için katlanmış değişiklik kümelerinin yeni commit mesajını isteyecektir.

Mq uzantısını kullanarak da benzer sonuçlar elde edebilirsiniz, ancak bu çok daha zordur.

Daraltma uzantısını sadece bölme yapmak için de kullanabilirsiniz, ancak bu kadar güzel bir kullanıcı arayüzü sağlamaz ve sonuçta ortaya çıkan commit mesajını düzenlemenin bir yolunu sağlamaz. Ortaya çıkan commit mesajını düzenlemek, her zaman kullandığım bir şey olan son mesajı da temizlemeye izin veriyor.


teşekkürler, tam da ihtiyacım olan buydu. Bunu TortoiseHg içinden yapabilmeniz güzel olurdu - ancak komut satırı yeterince basit.
sylvanaar

21

Evet, yamalarla yapabilirsiniz: Çalışmanızın 100'den 110'a kadar olan değişiklik setlerinde olduğunu varsayalım.

  1. Bir yama oluşturun:

    % hg export -o mypatch 100:110 --git

  2. 99'a güncelleyin:

    % hg update 99

  3. Yamayı --no-commit ile uygulayın (aksi takdirde tüm değişiklik setlerinizi geri alırsınız):

    % hg import --no-commit mypatch

  4. Tüm değişiklikleri tek seferde uygulayın:

    % hg commit

  5. Artık çalışma dizininizde ürettikleri dosyalar açısından eşdeğer olması gereken iki başınız (110 ve 111) var - belki eskilerini çıkarmadan önce akıl sağlığı açısından farklı olabilir:

    % hg strip 100

Tamam, şimdi hepsini hecelediğime göre, uzun görünüyor, ama bunu birkaç kez kendim yaptım, bunu çok fazla bir angarya bulmuyorum ...


1
Harika yanıt, ancak bir ön koşul var: MQ uzantısı etkinleştirilmelidir .
Chris Kelly

İkili dosyalardaki değişiklikleri de dahil etmek için --git seçeneğini kullandığınızdan emin olun: örneğin: "hg export -o mypatch 100: 110 --git" Daha fazla bilgi için, lütfen bakınız: stackoverflow.com/a/12537738/ 367663 Cevabı değiştirme özgürlüğünü aldım.
Kharlos Dominguez

1
Aşırı karmaşık görünüyor, neden olmasın hg strip --keepve sonra her şeyi tek bir işlemde gerçekleştirsin?
G. Demecki

@ G.Demecki Potansiyel olarak çok kayıplı bir operasyon olduğu için ..? MQ aşırıdır (ve hatta çoğu zaman tavsiye edilmez), böyle bir iş akışını istemenin dışında.
user2864740

@ user2864740 Haklı olabilirsin, çünkü ben Mercurial uzmanı değilim. Ancak varsayılan hg stripolarak .hg/strip-backup/dizine bir yedek yerleştirir . Sanırım o kadar güvenli değil git reflogama yine de bir çeşit kurtarma sağlıyor.
G. Demecki

19

TortoiseHg kullanıyorsanız, sadece iki revizyonu seçin (sonraki olmayanları seçmek için CTRL kullanın), sağ tıklayın ve "Geçmişi Sıkıştır" seçeneğini seçin .

Bundan sonra, daha önce seçtiğiniz ilk değişiklikten başlayarak yeni başlıkta yeni bir değişiklik listesi alacaksınız, seçtikleriniz arasındaki tüm alt değiştirme listelerini içerecektir.

Artık ihtiyacınız yoksa eski değişiklik listelerini kaldırabilirsiniz: bunun için MQ uzantılarını kullanın . Yine, TortoiseHg'de: tüm torunları ile soyulması gereken ilk değişiklik listesine sağ tıklayın, "Geçmişi Değiştir -> Soyun" .


18

Bu katlama için tercih ettiğim mq kullanma yöntemi, burada açıklandığı gibi TortoiseHg kullanmaktır . Ancak, komut satırından şu şekilde kolayca yapılabilir:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(Qfold adımını yapmanın daha iyi bir yolu olabilir, ancak bu işlem için genellikle TortoiseHg kullandığım için bunun farkında değilim.)

İlk başta biraz karmaşık görünüyor, ancak mq kullanmaya başladığınızda oldukça basit ve doğal - ayrıca mq ile oldukça kullanışlı olabilecek her türlü başka şeyi de yapabilirsiniz!


4

hg collapseve hg histediten iyi yollar. Ya da daha doğrusu, güvenilir bir şekilde çalışırlarsa en iyi yollar olurdu ... histeditÜç dakika içinde bir yığın dökümü ile çökmek zorunda kaldım. Collapseo kadar iyi değil.

Diğer iki BKM'yi paylaşabileceğimi düşündüm:

  1. hg rebase --collapse

    Bu uzantı Mercurial ile dağıtılmaktadır. Henüz onunla sorun yaşamadım. hg rebaseSınırlamaları aşmak için bazı oyunlar oynamak zorunda kalabilirsiniz - temelde, aynı daldaki bir ataya, adlandırılmış veya varsayılan olarak yeniden başlamayı sevmez, ancak (adlandırılmış) şubeler arasında yeniden ödeme yapmanıza izin verir.

  2. Depoyu ( foo/.hg) çalışma dizinine ( bar) ve dosyalarına taşıyın . Tersi değil.

Bazı insanlar iki klon ağacı oluşturmaktan ve aralarında dosya kopyalamaktan bahsetti. Veya aralarında yama yapmak. Bunun yerine, .hgdizinleri taşımak daha kolaydır .

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

Bu, gerçek depolar, .hgağaçlar çalışma dizininden ve dosyalarından bağımsız olduğu sürece çalışır .

Bağımsız değillerse ...


2015 yılında histeditbu görev için çok iyi bir seçenek. Hala bir git rebase yaptığım için buna güvenmiyorum -i, ama çökmüyor .. en azından daha yeni sürümler, bir şeyler korkunç bir şekilde ters giderse sizi geçici bir dalda bırakacak, bu nedenle değişiklik ayarlarının kaldırıldığı tek zaman. yeni şube taahhüt edildikten sonra.
user2864740

2

Mercurial'i hiç kullanmadım, ancak bu Martin Fowler'ın çok uzun zaman önce blogunda bahsettiği şeye çok benziyor:

http://martinfowler.com/bliki/MercurialSquashCommit.html


Bu biraz karmaşık görünebilir, ancak bağlantı için teşekkürler. Dürüst olmak gerekirse, getirme ve nakil çekme ve kiraz toplama değişim setleriyle yaptığı gibi, tam istediğim şeyi yapacak sihirli bir uzantı olmasını umuyorum.
Lucas

0

Neden sadece hg strip --keepkomuta etmiyorsun ?

Daha sonra tüm değişiklikleri tek bir işlem olarak kaydedebilirsiniz.


@Strawberry cevap vermiyor mu? Yazarın sorusuna mükemmel cevap verdiğini düşünüyor. Söylemek istediğiniz şeyi açıklar mısınız?
G. Demecki

Bu çok eski bir tarih, bu yüzden sözü geri çekeceğim - ancak Onaylanmış cevap daha güvenilir bir referans gibi görünüyor.
Strawberry

1
@Strawberry Gerçekten de eski bir konu. Ancak kabul edilen yanıt güncel değil, çünkü Mercurial'ın artık bu iş için ayrı bir 3. taraf uzantısına ihtiyacı yok.
G. Demecki

0

HistEdit istediğinizi yapacak, ancak muhtemelen aşırıdır. İhtiyacınız olan tek şey bazı değişiklik kümelerini birlikte katlamaksa, Collapse Extension işi yapacaktır.


1
kullanıcı arayüzünün kullanımı ve anlaşılması çok daha kolay olmasına rağmen, bu onu kullanmak için fazlasıyla yeterli bir nedendir, ancak aynı zamanda birleştirilmiş değişiklik kümesi mesajını düzenlemek için bir mekanizma sağlar, ki bu da her zaman yapmak istediğim değişiklik kümelerini birleştirin.
Stefan Rusek

Ve sadece kullanıcı arayüzünü anlama sorunu, birinin gerçekten anlamadığıdır .. Her neyse, geçmişte histedit, 'mesajların' değiştirilmesine ve 'katlama' sırasında mesajların değiştirilmesine izin verirken. Histedit mükemmel; herhangi bir şey varsa, daraltma uzantısı yetersizdir.
user2864740

0

Diyelim ki Mercurial'de yayınlanmamış THISve THATtaahhütleriniz var ve bunların bir THISnoktada tek bir işleme katılmasını seviyorsunuz :

... --> THIS --> ... --> THAT --> ... --> LAST

Kayıtlarınızın yayınlanmadığını kontrol edin:

$ hg glog -r "draft() & ($THIS | $THAT)"

Kaydetmek için güncelleme LAST:

$ hg up

ve MQ'ya kadar taahhütleri içe aktar THIS:

$ hg qimport $THIS::.

Tüm yamaları kaldırın ve yalnızca önce uygulayın THIS:

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

Katıl THAT::

$ hg qfold $THATNAME

NOT Adı bulmak için şunu THATNAMEkullanın:

$ hg qseries

Tüm yamaları uygulayın ve bunları depo geçmişine taşıyın:

$ hg qpush -a
$ hg qfinish -a

Konuyla ilgili blog yazım Mercurial'de iki komisyona katılmak .


0

Evet, strip --keepYazarın sorusu için çalışıyor. Ancak, diğerlerinden biraz farklıydı, örneğin, 1'den 30'a kadar bir sürüme sahipseniz ancak yalnızca 12-15 sürümünü daraltmak istiyorsanız. Diğer çözümler işe yarıyor ama çalışmıyor strip --keep.

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.