Com Mercurial, como eu posso “compressa” uma série de changesets em um antes de empurrar?

StackOverflow https://stackoverflow.com/questions/1200691

Pergunta

Vamos dizer que eu tenho um local e um repositório remoto Mercurial. Agora, eu começar a trabalhar em um recurso. I trabalhar com ele, e quando eu acho que ele é feito, eu entrego o conjunto de alterações. Testá-lo um pouco mais, eu acho que eu poderia melhorar ainda mais este recurso por ajustes algo no código. I fazer a mudança e se comprometer. 20 minutos mais tarde, eu acho que há um bug neste novo recurso, então eu corrigi-lo e cometer esse também.

Agora tenho 3 changesets que eu realmente gostaria de empurrar para o repositório remoto como um conjunto de alterações com a mensagem "Implementando a função X", por exemplo.

Como posso fazer isso sem muito incômodo? Eu acredito que eu poderia fazê-lo com manchas, mas parece que um monte de trabalho.

Foi útil?

Solução

Como sobre o Recolher Extensão ?

Outras dicas

O histedit extensão é exatamente o que você está procurando .

hg histedit -o

ou

hg histedit --outgoing

trará uma lista de changesets de saída. Na lista você pode

  • Dobre 2 ou mais changesets criando um único changeset
  • changesets gota removendo-os da história
  • changesets Reordenar no entanto você gosta.

histedit irá pedir-lhe para a nova mensagem de submissão dos changesets dobradas que o padrão é as duas mensagens com "\ n *** \ n" separando-os.

Você também pode obter resultados semelhantes usando a extensão mq, mas é muito mais difícil.

Você também pode usar a extensão colapso para simplesmente dobrar, mas não fornece como nice um UI e não fornece uma maneira de editar o resultando cometer mensagem. Editar a mensagem de commit resultando também permite limpar a mensagem final, que é algo que eu sempre acabam utilizando.

Sim, você pode fazê-lo com correções: Vamos supor que seu trabalho está em changesets 100 a 110, inclusive

  1. Criar um patch:

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

  2. Update para 99:

    % hg update 99

  3. Aplicar o patch com --no-commit (caso contrário, você vai ter todos os seus changesets de volta):

    % hg import --no-commit mypatch

  4. confirmar todas as alterações de uma vez:

    % hg commit

  5. Agora você tem duas cabeças (110 e 111), que deve ser equivalente em termos de arquivos que eles produzem em seu diretório de trabalho - talvez diff-los para a sanidade antes de descascar os antigos out:

    % hg strip 100

OK, agora que eu ter escrito tudo para fora, parece longo, mas ter feito isso um monte de vezes eu mesmo, eu não encontrá-lo para ser demasiado de uma tarefa ...

Se você estiver usando TortoiseHg, o uso pode apenas selecionar duas revisões (use Ctrl para selecionar os não-subseqüentes), clique direito e selecione "Compress History" .

Depois que você vai ter uma nova lista de mudança no novo chefe a partir da primeira mudança que você selecionado antes, ele irá conter todas as listas de mudança descendente entre as que você selecionou.

Você pode simplesmente retirar listas de mudança de idade se você não precisa mais deles: use MQ extensões para ele. Mais uma vez, em TortoiseHg:. Clique direito sobre a primeira lista mudança que precisa ser descascada com toda a sua descendência, "Modificar Histórico -> Strip"

O meu método preferido de utilização mq para esta dobragem é usando TortoiseHg como descrito aqui . No entanto, ele pode facilmente ser feito a partir da linha de comando da seguinte forma:

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

(Pode haver uma maneira melhor de fazer o passo qfold, mas eu não estou ciente de que, como eu costumo usar TortoiseHg para essa operação.)

Parece um pouco complicado no início, mas uma vez que você começou a usar mq, é bastante simples e natural - e você pode fazer todos os tipos de outras coisas com mq que pode ser muito útil

hg collapse e hg histedit são as melhores maneiras. Ou melhor, seria a melhor forma, se eles trabalharam de forma confiável ... Eu tenho histedit a falhar com um despejo de pilha dentro de três minutos. Collapse não é muito melhor.

pensei que eu poderia compartilhar outras duas BKMs:

  1. hg rebase --collapse

    Esta extensão é distribuído com Mercurial. Eu não tive problemas com ele ainda. Você pode ter que jogar alguns jogos Para contornar limitações hg rebase -. Basicamente, ele não gosta rebasing a um ancestral no mesmo ramo, nomeada ou padrão, embora não permitir que ele se rebasing entre (nomeado) filiais

  2. Mover o repositório (foo/.hg) para o diretório de trabalho (bar) e seus arquivos. Não o contrário.

Algumas pessoas têm falado sobre a criação de duas árvores de clones, e copiar arquivos entre eles. Ou remendar entre eles. Em vez disso, é mais fácil para mover os diretórios .hg.

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

Isso funciona, desde que os verdadeiros repositórios, as árvores .hg, são independentes do diretório de trabalho e seus arquivos.

Se eles não são independentes ...

Eu nunca usei Mercurial, mas isso soa muito parecido com o que Martin Fowler estava falando em seu blog não muito tempo atrás:

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

Porque não basta comando hg strip --keep?

Depois, você pode confirmar todas as alterações como um commit.

HistEdit vai fazer o que quiser, mas é provavelmente um exagero. Se a única coisa que você precisa é de dobrar alguns changesets junto a Recolher Extensão irá fazer o trabalho.

Suponha que você tenha dois THIS e THAT commits inéditos em Mercurial e como eles se juntar em única confirmação no ponto THIS ::

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

Verifique se seus commits não são publicados ::

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

Update para LAST cometer ::

$ hg up

e importação compromete-se a THIS em MQ ::

$ hg qimport $THIS::.

Un-aplicar todos os patches e aplicar apenas o primeiro THIS ::

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

Junte-se a THAT ::

$ hg qfold $THATNAME

NOTA Para encontrar o nome utilização THATNAME ::

$ hg qseries

Aplique todos os patches e movê-los para a história repositório ::

$ hg qpush -a
$ hg qfinish -a

Meu blog post no assunto é Juntando dois commits em Mercurial .

Sim, strip --keep trabalha para a pergunta de Autor. Mas foi um pouco diferente dos outros, por exemplo, se você tem a versão de 1 a 30, mas só quer entrar em colapso versão 12-15. Outras soluções trabalho, mas não strip --keep.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top