Mercurial:Inclure secret de révisions dans le bundle?
-
10-12-2019 - |
Question
À l'aide de Mercurial, comment puis-je regrouper toutes les révisions sont pas connus pour être dans un autre référentiel, y compris secret de révisions?
Je sais bundle
's --base
option arrive à inclure secret des révisions, mais je ne veux pas le --base
comportement.(Et il semble exceptionnellement étrange secret que les révisions sont toujours inclus avec --base
mais sont jamais inclus sans elle.Ne devrait-il pas être une option séparée?)
Pour info, j'ai souvent envie de faire une sauvegarde de toutes les révisions qui ne sont que dans mon local repo avant de tenter une potentiellement dangereux de l'histoire de réécriture.
La solution
Il est exact que les hg bundle
normalement exclure secret des révisions.C'est parce que c'est juste de l'exécution de l'équivalent de hg outgoing
et le groupement de ces révisions.
De sorte que certaines des solutions de rechange:
Si vous savez que vous avez au moins un projet de publique ou sortant de la révision comme un ancêtre de votre secret révisions, alors vous pouvez utiliser
$ hg bundle --base "parents(outgoing())"
pour obtenir ce que vous voulez.L'
outgoing()
revset prendra le manque de projet et de public révisions etparents(outgoing()
sera adapté bases.Puisque vous utilisez--base
vous obtenez tous les descendants (public, projet de, et le secret) à partir de ces bases.Vous pourriez rendre temporairement votre secret révisions projet, bundle, puis la marque les secrets de nouveau:
$ secret=$(hg log --template "{rev} " -r "secret()"); \ hg phase -d $secret; \ hg bundle out.hg; \ hg phase -f -s $secret
(J'utilise Zsh et là, j'ai eu à utiliser
${=secret}
au lieu de$secret
parce que Zsh ne fait pas de couper un mot sur le paramètre d'extension par défaut.)Il est important de la chaîne de commandes avec
;
au lieu de&&
puisque vous voulez réinitialiser les phases indépendamment de ce qui se passe dans lehg bundle
appel de transmission de mauvais paramètres dehg bundle
ne doit pas signifier que vous perdez toutes les informations sur le secret des révisions.Notez également que depuis secret des révisions seuls ont le secret descendants, il n'y a pas de perte d'information avec cette technique.Vous pouvez le tourner dans une coquille alias:
[alias] bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); hg phase -d $secret; hg bundle $@; hg phase -f -s $secret
L'
$@
est élargi par Mercurial avant l'alias est invoquée et cela vous permet d'insérer les arguments nécessaires pourhg bundle
.
Notez que les informations de phase ne peut pas être stockée dans des faisceaux — le format bundle n'a pas été modifié pour en tenir compte.
Autres conseils
Si vous savez qu'il existe au moins un ensemble de modifications, vous pouvez utiliser ceci:
hg bundle -r "not public()" --base public()
Otoh, que, cela ne fonctionnera pas si il y a pas de révisions, utilisez ceci à la place:
hg bundle -r "not public()" --base null
Le problème avec Martin réponse est qu'il s'appuie sur sortant, qui à son tour repose sur une connexion directe à la poussée des pensions.Si vous n'avez toujours pas de connexion à internet pour que les pensions, ces méthodes fonctionnent bien pour moi.C'est aussi un peu plus simple que la phase de la danse.
Un test pour savoir si il y a de tout public des révisions est de capturer la sortie de:
hg log -r public() -l 1 --template "{rev}"
et de tester sa longueur, ou de la présence de [0-9].