Pergunta

Say, I fez muitas mudanças para o meu código e só precisam se comprometer algumas dessas mudanças. Existe uma maneira de fazê-lo em mercurial? Eu sei que darcs tem um recurso como este.

Eu sei hg transplant pode fazer isso entre os ramos, mas eu preciso de algo assim para cometer código no presente ramo e não quando a adição de conjuntos de mudanças de algum outro ramo.

Foi útil?

Solução

MQ como Chad mencionados são uma maneira. Há também soluções mais leves:

  • Registro extensão que funciona mais ou menos da mesma forma que darcs registro. É distribuído com mercurial.
  • Shelve extensão que permite que você "Shelve" certas mudanças, o que lhe permite cometer apenas um subconjunto de suas mudanças (as que não são arquivados)

Outras dicas

Se você estiver usando TortoiseHg 1.x para Windows, este recurso é implementado lindamente direito da caixa (sem extensões necessárias).

  1. Execute o TortoiseHg Commit Tool.
  2. Escolha um arquivo para o qual você só quer cometer um subconjunto de sua alterar.
  3. Clique no Hunk guia Selection no painel de visualização.
  4. Clique duas vezes ou usar a barra de espaço para alternância que mudam pedaços deve ser incluído no cometer.

Para TortoiseHg 2.x , a guia Hunk Seleção é ido agora. Em seu lugar, é a Shelve ferramenta . Tem mais algumas funcionalidades que a seleção pedaço de idade. Esses novos recursos vêm à custa de alguma complexidade adicional.

enter descrição da imagem aqui

Note que não há necessidade de activar explicitamente a extensão Mercurial Shelve ao usar este recurso. De acordo com Steve Borho (chumbo TortoiseHg desenvolvedor) em a uma pergunta diferente TortoiseHg : "Nós temos uma cópia local da extensão prateleira e chamada para ele diretamente."


Para TortoiseHg 2,7 + , esta funcionalidade foi melhorada e re-introduzido. Agora é construído diretamente na ferramenta Commit:

exemplo de seleção mudança no cometer ferramenta

Observe na lista de arquivos à que o arquivo superior esquerdo está marcada para indicar que será incluído, o segundo arquivo é desmarcada porque ele não será incluído, eo terceiro arquivo, Sample.txt, está cheio (o Null indicador de caixa) porque só selecionar as alterações de arquivo que será incluído no cometer.

A mudança para Sample.txt que será incluído é verificada na porção seleção mudança inferior direito da imagem. A mudança que serão excluídos está desmarcada ea vista diff fica acinzentado. Note também que o ícone da ferramenta de prateleira ainda está prontamente disponível.

O tutorial Mercurial Filas é terrível para este caso de uso. Todos os exemplos que eu vi supor que você ainda tem que fazer um commit e você estiver atualizando um único patch. Na maioria das vezes isso não é o caso, e você tem 2 ou 3 commits que você quer esmagar juntos ou mudança de alguma outra forma.

Vamos dizer que você tem esse tipo de história:

---O---O---A---B---C

O primeiro exemplo é de squash comete A, B, e C. Primeira inicialização mq:

$ hg qinit

Agora precisamos "importação" os commits A, B e C para a fila de patch. Vamos assumir que eles são os últimos 3 commits. Podemos usar o "N" sintaxe revisão para importá-los assim:

$ hg qimport -r -3:-1

Isso significa importar como manchas de 3 patches de backup para a última confirmação. Você pode verificar o status desses patches com hg qseries. Ele deve mostrar algo como isto:

$ hg qseries
101.diff
102.diff
103.diff

Onde os números 101, 102 e 103 correspondem aos números de revisão locais dos commits A, B e C. Agora essas manchas são aplicada , o que significa que as mudanças que eles descrevem são já no cópia de trabalho. Você pode se livrar do muda a cópia de trabalho e removê-los a partir do histórico de commits, salvando-os na única forma de patch, usando hg qpop. Você pode dizer hg qpop; hg qpop pop mudanças C e B da pilha, ou especificar um patch para "pop com". Neste caso, seria algo como isto:

$ hg qpop 101.diff
now at: 101.diff

Agora você tem os patches para commits B e C na fila remendo, mas eles não são aplicadas (suas mudanças foram "perdidos" - eles só existem na fila área do patch). Agora você pode dobrar esses patches para o último, ou seja, criamos um novo commit que é o equivalente à soma das mudanças A + B + C.

$ hg qfold -e 102.diff 103.diff

Isto irá mostrar o seu editor para que você possa alterar a mensagem de commit. Por defeito, a mensagem será a concatenação do mensagens para o muda A, B e C, separados por asteriscos cometer. O bom aqui é que hg qfold vontade tab-completar os patches se você estiver usando bash e ter o script hg-conclusão de origem. Isso deixa a história como esta, em que A + B + C é uma única confirmação que é a combinação dos 3 patches que nos interessam:

---O---O---A+B+C

Outro caso de uso é se temos o mesmo tipo de história como antes, mas queremos deixar cair remendo B e mesclar A + C. Isso é muito semelhante ao anterior, na verdade. Quando você chegar à etapa qfold, você simplesmente dobrar no último commit em vez dos 2 últimos commits:

$ hg qfold -e 103.diff

Isso deixa a mudança para B na fila de patch, mas ela não é aplicada para a cópia de trabalho e sua cometem não está na história. Você pode ver isso executando:

$ hg qunapplied
102.diff

A história agora se parece com isso, onde A + C é uma única confirmação que combina muda A e C:

---O---O---A+C

Um caso de uso final pode ser que você precisa para aplicar somente comprometer C. Você faria isso executando o qimport como acima, e você seria pop off todos os patches que você não quer:

$ hg qpop -a

Os meios bandeira -a pop off todos os patches. Agora você pode aplicar apenas o que você quer:

$ hg qpush 103.diff

Isso deixa você com essa história:

---O---O---C

Uma vez que você é feito com tudo isso, você precisa para acabar com a fila de mexer. Isso pode ser feito com:

$ hg qfinish -a

Então, lá estamos nós. Agora você pode executar hg push e só cometer exatamente o que você quer, ou hg email um patch coerente para a lista de discussão.

Eu sinto como se estivesse faltando alguma coisa porque ninguém sugeriu isso já.

O normal "hg commit" comando pode ser usado para escolher seletivamente o que se comprometer (você não tem de se comprometer todas as alterações pendentes no diretório de trabalho local).

Se você tem um conjunto de mudanças assim:

M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml

Você pode cometer apenas duas dessas mudanças com ...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml

Não super conveniente a partir da linha de comando porque você tem que mão-escrever os arquivos para cometer seletivamente (vs um processo de check-box GUI como tartaruga), mas é quase tão simples quanto ele ganha e não requer extensões. E file-englobamento provavelmente pode ajudar a reduzir a digitação (como seria acima, ambos os arquivos comprometidos compartilhar exclusivamente "Liferay" em seus caminhos.

Você pode usar o registro extensão , que é distribuído com Mercurial.

Você precisa habilitá-lo em seu arquivo ~/.hgrc primeiro, adicionando-o à seção [extensions]:

[extensions]
record=

Em seguida, basta digitar hg record vez de hg commit, e você será capaz de selecionar o que muda para os arquivos que você quer se comprometer.

Você também pode usar o crecord extensão que fornece uma interface mais agradável para análise e selecione as mudanças. (Ele não é distribuído com Mercurial, embora, e eu já vi isso ocasionalmente atrapalhar a cometer por isso não é completamente livre de bugs.)

Algum tempo passou. Parece ser a melhor opção agora é hg commit --interactive

Eu acredito Mercurial Filas preenche esse papel para o Mercurial. Há um bom muito tutorial ligada lá.

Tente QCT (Qt Commit Tool). Ele tem uma característica "select mudanças" que inicia a ferramenta de mesclagem de 3 vias para você a mudanças individuais de desfazer. Depois de se comprometer, essas alterações "desfez" voltar.

Eu uso comprometer-patch . É um script que permite que você edite o diff antes de cometer. É realmente agradável com diff-mode e modo vc Emacs do.

No passado eu usei crecord, mas tem erros relacionados com unicode (na verdade a extensão registro tem os erros, que crecord depende).

Primeiro você deve esquecer tudo o que sabia sobre GUI do e voltar para a linha de comando. Avançar na linha de comando faça o seguinte:

hg status> filelist.txt

Este tubulações todos os seus arquivos modificados para um arquivo de texto chamado filelist.txt

A seguir, edite a sua lista de arquivos para incluir apenas os arquivos que você deseja cometer.

Finalmente cometer usando o sytnax conjunto de arquivos:

hg commit "set: 'listfile: test.txt'"

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