¿Puedes cerrar una rama de Mercurial sin actualizarla primero?
branch (2)
Gracias a Vince por el enfoque. He implementado esto como una secuencia de comandos de Python: fue un poco más de trabajo del que inicialmente esperaba, así que espero que esto le ahorre a otros algún tiempo. Probado en Windows 8.1 con TortoiseHg 3.3 y Python 2.7.9.
La retroalimentación es bienvenida, probablemente podría hacerlo con cierta delicadeza, particularmente con respecto al manejo de errores.
#!/usr/bin/python
from subprocess import check_output
def close_branch( branch, message ):
if not message:
message = ''Closing branch "{}"''.format( branch )
print( ''Closing branch "{}"''.format( branch ) )
try:
check_output( ''hg debugsetparent '' + branch )
check_output( ''hg branch '' + branch )
check_output( ''hg commit --close-branch -X * -m "'' + message + ''"'' )
except:
print( ''Failed to close branch.'' )
def main():
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(''branch'', help=''branch name(s)'', nargs = ''+'' )
parser.add_argument(''-m'', ''--message'', help=''message (defaults to "Closing branch <branch name>")'' )
args = parser.parse_args()
status = check_output( ''hg status'' )
if len(status) > 0:
print( ''Do not use this script with local changes. Commit/revert changes and try again'' )
exit(1)
# Cache initial revision and branch.
initial_revision = check_output( ''hg id -i -b'' ).split()
# print( ''Using: '' + initial_revision[0].decode("utf-8") )
for branch in args.branch:
close_branch( branch, args.message )
# Return to original changeset
check_output( ''hg debugsetparent '' + initial_revision[0].decode("utf-8") )
check_output( ''hg branch '' + initial_revision[1].decode("utf-8") )
if __name__ == ''__main__'':
main()
Soy consciente de que puedes cerrar una rama de Mercurial con:
hg update rev-number
hg commit --close-branch -m "Closing branch."
Sin embargo, algunos de los repositorios con los que trabajo son bastante grandes, y después de descubrir una sucursal suelta de años anteriores que quiero cerrar, actualizarla primero puede tomar muchos minutos (si no horas), solo para hacer un compromiso y luego actualizar Volviendo a la revisión original en la que estaba trabajando (más minutos, si no horas).
Entonces, mi pregunta, ¿hay alguna forma de cerrar una sucursal de Mercurial sin actualizar primero el directorio de trabajo a la revisión de la sucursal?
Sí, puedes, pero esto no está documentado en ninguna parte. He usado esta técnica durante mucho tiempo, no te preocupes, es seguro.
En lugar de actualizar, puede emitir los siguientes comandos
hg debugsetparent <revision>
hg branch <branchOfRevision>
Tenga en cuenta que el orden es importante. Esto hará que su representante piense que está en la nueva revisión, mientras que todos sus archivos son de la versión inicial. Después de eso, puede usar --close-branch
commit, pero use la opción -X *
para hacer un commit vacío.
hg commit --close-branch -X * -m "Closing branch."
Ahora, simplemente vuelve a tu cabeza anterior, como si nada hubiera pasado.
hg debugsetparent <InitialRevision>
hg branch <branchOfInitialRevision>
Finalmente, si tiene sub-repos, es posible que desee cambiar temporalmente el nombre del archivo .hgsub
antes de --close-branch
, y renombrar nuevamente después.