Pregunta

Usando Mercurial, ¿cómo puedo agrupar todos los conjuntos de cambios que no se sabe que están en otro repositorio? incluido conjuntos de cambios secretos?

bundle's --base La opción incluye conjuntos de cambios secretos, pero no quiero que --base comportamiento.(Y parece inusualmente extraño que los conjuntos de cambios secretos sean siempre incluido con --base pero son nunca incluido sin él.¿No debería haber una opción separada?)

Para su información, normalmente quiero hacer una copia de seguridad de todos los conjuntos de cambios que solo están en mi repositorio local antes de intentar una reescritura del historial potencialmente peligrosa.

¿Fue útil?

Solución

Tienes razón en que hg bundle normalmente excluirá los conjuntos de cambios secretos.Esto se debe a que simplemente está ejecutando el equivalente a hg outgoing y agrupar estos conjuntos de cambios.

Algunas soluciones:

  • Si sabe que tiene al menos un borrador o un conjunto de cambios saliente público como antecesor de sus conjuntos de cambios secretos, entonces puede usar

    $ hg bundle --base "parents(outgoing())"
    

    para conseguir lo que quieres.El outgoing() revset seleccionará el borrador faltante y los conjuntos de cambios públicos y parents(outgoing() Serán bases adecuadas.desde que usas --base obtienes todos los descendientes (públicos, borradores y secretos) de estas bases.

  • Puede hacer temporalmente que sus conjuntos de cambios secretos se redacten, agrupen y luego los marquen como secretos nuevamente:

    $ secret=$(hg log --template "{rev} " -r "secret()"); \
      hg phase -d $secret; \
      hg bundle out.hg; \
      hg phase -f -s $secret
    

    (Yo uso Zsh y ahí tuve que usar ${=secret} en lugar de $secret porque Zsh no divide palabras en la expansión de parámetros de forma predeterminada).

    Es importante encadenar los comandos con ; en lugar de && ya que querrás restablecer las fases independientemente de lo que suceda en el hg bundle llamada: pasar parámetros incorrectos a hg bundle Esto no debería significar que se pierda toda la información sobre los conjuntos de cambios secretos.Tenga en cuenta también que, dado que los conjuntos de cambios secretos solo tienen descendientes secretos, no hay pérdida de información con esta técnica.

    Puedes convertir esto en un alias de shell:

    [alias]
    bundle-all = !secret=$(hg log --template "{rev} " -r "secret()");
                 hg phase -d $secret;
                 hg bundle $@;
                 hg phase -f -s $secret
    

    El $@ Mercurial lo expande antes de que se invoque el alias y esto le permite insertar los argumentos necesarios para hg bundle.

Tenga en cuenta que la información de fase no se puede almacenar en paquetes; el formato del paquete no se ha cambiado para acomodarla.

Otros consejos

Si sabes que hay al menos un conjunto de cambios público, puedes usar esto:

hg bundle -r "not public()" --base public()

OTOH, eso no funcionará si no hay conjuntos de cambios públicos, usa esto en su lugar:

hg bundle -r "not public()" --base null

El problema con la respuesta de Martin es que depende de la salida, que a su vez depende de una conexión directa al repositorio push.Si no siempre tienes una conexión a Internet para ese repositorio, estos métodos funcionan bien para mí.También es algo más simple que el baile de fases.

Una prueba para saber si hay conjuntos de cambios públicos es capturar el resultado de:

hg log -r public() -l 1 --template "{rev}"

y pruebe su longitud, o la presencia de [0-9].

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top