Skip to main content

Kaip pašalinti nereikalingus keitimus su mercurial transplant?

Išsiaiškinau įdomų dalyką, nusprendžiau pasidalinti atradimu.

Tarkime turite visą eilę pakeitimu, failuose su kuriais dirbate. Visus pakeitimus saugote Mercurial DVCS pagalba. Po kurio laiko pastebite, kad dalis darytų pakeitimų, gadina jūsų darbą ir norite juos pašalinti.

Pateiksiu pavyzdį, su vienu failu, kad būtų aiškiau. Tarkime turiu tokių keitimų sąrašą:

@ changeset: 6:e17baf640494
| user: sirex
| date: Tue Jan 12 22:20:33 2010 +0200
| summary: c
|
o changeset: 5:95fc32abe5f2
| user: sirex
| date: Tue Jan 12 22:20:27 2010 +0200
| summary: b
|
o changeset: 4:66c0e9ff6c77
| user: sirex
| date: Tue Jan 12 22:20:21 2010 +0200
| summary: a
|
o changeset: 3:9f0e3fcf1600
| user: sirex
| date: Tue Jan 12 22:20:04 2010 +0200
| summary: b
|
o changeset: 2:53fb42c364d2
| user: sirex
| date: Tue Jan 12 22:19:57 2010 +0200
| summary: a
|
o changeset: 1:c9fa842d083d
| user: sirex
| date: Tue Jan 12 22:19:43 2010 +0200
| summary: b
|
o changeset: 0:9c2929bb13fc
  user: sirex
  date: Tue Jan 12 22:19:11 2010 +0200
  summary: a

Visi šie keitimai keičia failą file.txt, kiekviename pakeitime į failą įkelta nauja eilute su raide, kuri nurodytą keitimo aprašyme. Galutinis failo turinys yra toks:

$ cat file.txt
a
b
a
b
a
b
c

Mano užduotis – pašalinti visus b keitimus. Norint tai atlinkti, reikia visus gerus pakeitimus iškelti į kitą šaką.

Prieš pradedant transplant veiksmą, grąžiname savo darbinį katalogą į paskutinį gerą keitimą:

$ hg up 0

Tada pradedam transplant veiksmą:

$ hg transplant -b 6
changeset: 1:c9fa842d083d
user: sirex <sirexas@gmail.com>
date: Tue Jan 12 22:19:43 2010 +0200
summary: b

apply changeset? [ynmpcq?]: ?
y: transplant this changeset
n: skip this changeset
m: merge at this changeset
p: show patch
c: commit selected changesets
q: cancel transplant
?: show this help
apply changeset? [ynmpcq?]:

Toliau reikia tiesiog spaudyti y, jei pakeitimas yra geras arba n, jei blogas.

Jei geras keitimas yra susijęs su bloguoju, mercurial gali nesugebėti įkelti gero keitimo, nes paprasčiausiai failo turinys, kurio pagrindu buvo atliktas gerasis keitimas pasikeitė, pašalinus blogą keitimą.

Gaila, bet m: merge at this changeset nepavyko panaudoti, todėl jei nepavyksta sujungti keitimų, tenka tai spręsti rankiniu būdu, taip:

applying 9e6f5cccf15b
patching file file.txt
Hunk #1 FAILED at 0
1 out of 1 hunks FAILED -- saving rejects to file file.txt.rej
patch failed to apply
abort: Fix up the merge and run hg transplant --continue

Atsidarykite nurodytą failą file.txt ir informacinį failą su informacija apie nesutampantį fragmentą file.txt.rej. Peržiūrėkite kas nesutampa ir pataisykite originalų failą file.txt.

Galiausiai turėsite naują šaką, tik su gerais pakeitimais:

@ changeset: 9:e17baf640494
| user: sirex
| date: Tue Jan 12 22:20:33 2010 +0200
| summary: c
|
o changeset: 8:c4671106cf7a
| user: sirex
| date: Tue Jan 12 22:20:21 2010 +0200
| summary: a
|
o changeset: 7:f45376781321
| parent: 0:9c2929bb13fc
| user: sirex
| date: Tue Jan 12 22:19:57 2010 +0200
| summary: a
|
o | changeset: 6:e17baf640494
| | user: sirex
| | date: Tue Jan 12 22:20:33 2010 +0200
| | summary: c
| |
o | changeset: 5:95fc32abe5f2
| | user: sirex
| | date: Tue Jan 12 22:20:27 2010 +0200
| | summary: b
| |
o | changeset: 4:66c0e9ff6c77
| | user: sirex
| | date: Tue Jan 12 22:20:21 2010 +0200
| | summary: a
| |
o | changeset: 3:9f0e3fcf1600
| | user: sirex
| | date: Tue Jan 12 22:20:04 2010 +0200
| | summary: b
| |
o | changeset: 2:53fb42c364d2
| | user: sirex
| | date: Tue Jan 12 22:19:57 2010 +0200
| | summary: a
| |
o | changeset: 1:c9fa842d083d
| | user: sirex
| | date: Tue Jan 12 22:19:43 2010 +0200
| | summary: b
|/
o changeset: 0:9c2929bb13fc
  user: sirex
  date: Tue Jan 12 22:19:11 2010 +0200
  summary: a

Grįžtame atgal į pagrindinę šaką ir prijungiame atrinktus geruosius keitimus, visiškai eliminuojant bloguosius:

$ hg up 6
$ hg --config ui.merge=internal:other merge 9
$ hg ci -m "Atstatyti tik gerieji keitimai."

Galiausiai gausite tokį file.txt turinį:

$ cat file.txt
a
a
a
c

Ir tokį keitimų medį:

@ changeset: 9:e17baf640494
| user: sirex
| date: Tue Jan 12 22:20:33 2010 +0200
| summary: Atstatyti tik gerieji keitimai.
|\
| o changeset: 9:e17baf640494
| | user: sirex
| | date: Tue Jan 12 22:20:33 2010 +0200
| | summary: c
| |
| o changeset: 8:c4671106cf7a
| | user: sirex
| | date: Tue Jan 12 22:20:21 2010 +0200
| | summary: a
| |
| o changeset: 7:f45376781321
| | parent: 0:9c2929bb13fc
| | user: sirex
| | date: Tue Jan 12 22:19:57 2010 +0200
| | summary: a
| |
o | changeset: 6:e17baf640494
| | user: sirex
| | date: Tue Jan 12 22:20:33 2010 +0200
| | summary: c
| |
o | changeset: 5:95fc32abe5f2
| | user: sirex
| | date: Tue Jan 12 22:20:27 2010 +0200
| | summary: b
| |
o | changeset: 4:66c0e9ff6c77
| | user: sirex
| | date: Tue Jan 12 22:20:21 2010 +0200
| | summary: a
| |
o | changeset: 3:9f0e3fcf1600
| | user: sirex
| | date: Tue Jan 12 22:20:04 2010 +0200
| | summary: b
| |
o | changeset: 2:53fb42c364d2
| | user: sirex
| | date: Tue Jan 12 22:19:57 2010 +0200
| | summary: a
| |
o | changeset: 1:c9fa842d083d
| | user: sirex
| | date: Tue Jan 12 22:19:43 2010 +0200
| | summary: b
|/
o changeset: 0:9c2929bb13fc
  user: sirex
  date: Tue Jan 12 22:19:11 2010 +0200
  summary: a