2010-09-11 9 views
14

Aşağıdaki durum var:Mercurial'daki depolar arasındaki bireysel değişiklikleri nasıl alabilirim/çekebilirim?

  • Ben sitesi A, bu Mercurial repo var sahiptir ve biz bir müddet geliştirme. A'nın 5 revizyonu olduğunu varsayalım.
  • Şimdi, grafik tasarım dışında çoğunlukla site A ile neredeyse aynı olan Site B'yi oluşturmamız gerekiyor. Bu yüzden repo'yu klonladım, site B'yi başlattım ve şimdi B repo'nun A'nın tüm tarihi, artı A'ya (çoğunlukla CSS ve görüntüler) geri dönmemesi gereken bir grup değişiklik var. Diyelim ki bu değişiklikler bana 3 revizyon aldı.
  • Son olarak, artık B'ye geri dönmek istediğimi, A'ya değiştirdiğimi ve her iki siteye ait olduğu için bir değişiklik yaptım. B repo'unda bu revizyon 9.

Soru: Revizyon 9'u B8 repolarından A repo'ya nasıl değiştirebilirim?

  • Normal itme/çekmeyi denedim, ancak bu tüm değişiklikleri değiştirir.
  • Paketleri veya ekleri dışa aktarmayı denedim, ancak eksik üst öğe nedeniyle A'yı içe aktarmayı reddedenler.

Ben DVCS güzelliklerinden biri kolayca ("merkezi" VCS dünyada ben şube ve birleştirmeye de kolayca düzeltmek hangi bu tür şeyleri yapabileceğini, ben Vault a ile yaptık olduğunu düşünmüş çok ve oldukça kolay).

Burada bir şey mi özlüyorum?

NOT: "MQ" ye baktım, ancak bu büyük bir solucan kutusu gibi gözüküyor ve normal etkinleştirilme döngüsünü yalnızca etkin olduğu için etkileyecek gibi görünüyor. Bu doğru mu?

Herhangi bir yardım veya işaretçi büyük takdir edilecektir. Teşekkür ederim!

Daniel

cevap

11

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

"changesets kümesi cherrypick için nakli kullanma" altında bakınız:

hg transplant REV1:REV2 REV3 
:

Nakli birden changesets veya changeset yönetebilir böyle aralıkları

Bu örnek, REV1: REV2 tarafından belirtilen değişiklikler ve çalışma dizini revizyonu üzerine ek değişiklikler.

İdeal olarak bunu dallarla yapacak mısın?

+0

Şubeler: Hmmmm, gerçekten emin değilim. Mercurial Şubelerini anlama konusunda büyük bir başarı elde edemedim :-) Bunlar 2 farklı klasörde 2 farklı klasörde bulunan 2 farklı site var ... Apps Kasası'nda şubelerle nasıl yapılacağını biliyorum ama bunu nasıl yapabilirim? Hg? Bazı dallanma yapmayı denediğimde, temelde bir çalışma klasörüne sahiptim ve şubelerin hangisinin orada olduğunu değiştirebiliyordum (* güncelleme *) ... –

+0

Bu klasörlerin her birinde iki şubeye sahip olmayı önerdim (toplam üç) . Biri paylaşımlı taahhütlerle ve diğeri ise diğer repo'ya asla girmeyecek olan bir taahhütle. İhtiyacınız olduğunda belirli şubelerle paylaşılan şubede birleşiyorsunuz :-) Mercurial şubeleriyle ilgili bir açıklama için: http://mercurial.selenic.com/wiki/Branch#Creating_a_Branch Daha fazla sorunuz varsa :-) – ikanobori

+0

Ah, ilginç. Bununla deneyeceğim. Fikir için teşekkürler! –

11

Ben komutları bu şekilde düşünüyorum:

  • hg bundle sana bir Changeset bir ikili sürümünü verir ve hg unbundle alıcı tarafında aynı Changeset içine paket dönecek.

    Paketi ve içerdiği

  • hg export

    sana bir Changeset bir metin temsilini verir ve kullandığınız sürece .. diyelim ki, e-posta ve ikili yama mevcut olması ebeveyn changesets bağlıdır, üzerinde changesets orada aktarmak için vardır hg import için --exact komut satırı bayrağı, ardından bu düzeltme eki, alıcı tarafında tam olarak aynı değişiklikleri oluşturmaz.

    --exact kullanmamanın avantajı, herhangi bir metin çakışması olmadığı sürece böyle bir yamayı istediğiniz yere uygulayabilmenizdir.

  • hg transplanthg export ve hg import civarında ince bir sarıcıdır.

    Hiç "kat" veya cıva repo tarih atlamak istiyorsanız
1

, sadece taban revizyon güncellemek (pas istediğiniz bölümü önce). Bunun üstündeki herşeyi tek bir değişiklik kümesine katlamak istiyorsanız (bu istediğiniz gibi görünür), yalnızca 'u bu şubenin başına geri döndürün ve bu işlemi gerçekleştirin (veya yalnızca istediğiniz dosyaları işleyin). Bu, istediğiniz şeylerle yeni bir değişiklik oluşturacaktır, böylece bunu sitenize aktarabilirsiniz. A. İstemediğiniz şeyleri göz ardı edersiniz (veya görmezden gelemezseniz).

Katlamak istediğiniz katın üzerinde birden fazla değişiklik varsa, rebase. Rebase uzantısını etkinleştirin ve # 5 değerini # 5 konumuna getirin. # 9'ın herhangi bir çocuğu varsa, bunlar onunla birlikte hareket eder. Rebase (benzer bir şey yapar) nakli için tercih edilir çünkü rebase, değişiklikleri daha olası hale getirerek, değişiklikleri birleştirmek için 3-yollu birleştirme makinesini kullanır. Transplant, az ya da çok sadece bir aptal ihracat-ithalattır, bu yüzden ortak geçmişi göz ardı eder.

İlgili konular