2010-07-12 2 views
0

J'ai un référentiel local mercurial avec 5 validations qui doivent encore être poussées vers le serveur. Cependant, j'ai accidentellement inclus une ligne dans deux fichiers spécifiques depuis les 4 dernières validations que je ne veux vraiment pas avoir dedans (ni dans l'un des changesets).Mercurial: comment supprimer une ligne dans un fichier, pour les 4 derniers changesets (pas encore poussés)?

Existe-t-il un moyen pratique de supprimer ces lignes dans ces deux fichiers? (en dehors de jeter mon référentiel local, cloner la copie du serveur, et réappliquer manuellement toutes les modifications à nouveau)

Répondre

6

Vous allez obtenir beaucoup de suggestions différentes (mq, histedit, import/export) que tout essentiellement faire la même chose. Et ils vont tous se sentir vraiment maladroits parce que le mercurial est construit autour du concept d'une histoire immuable - l'histoire changeante est censée être dure. Cela dit, si vous comprenez correctement si vous n'avez pas encore poussé les csets, c'est possible. Voici la procédure que je l'utilise - je préfère parce qu'il nécessite aucune extension permettant:

hg export --git -o ../all-five-csets.patch 0:tip 
cd .. # exit the repo 
vi all-five-csets.patch # delete the line manually each time it appears (probably only once) 
hg init newrepo 
cd newrepo 
hg import ../all-five-csets.patch 
cd .. 
mv repo was-repo 
mv newrepo repo 

Tout ce qui se passe là-bas vous est exportez les csets au texte des représentations d'eux-mêmes. Créer un nouveau repo vide, puis réimporter les csets. Je les ai tous fait parce que vous n'en avez que cinq. Si vous envisagiez de modifier les 5 derniers sur 500, j'aurais créé le newrepo en faisant un clone -r qui clone "jusqu'à un certain point" et ensuite appliqué les csets que j'avais laissés derrière eux dans leur forme éditée via l'import

+0

Bien expliqué! Une question: la ligne apparaît en effet une fois, mais elle est précédée d'un '+', et l'ancienne (bonne) ligne est précédée d'un '-' pour indiquer le diff. Est-ce que je supprime vraiment la ligne '+' et laisse la ligne '-' en place. Ou est-ce que je supprime les lignes '+' et '-'? (Bien sûr, alternativement, je pourrais simplement changer la ligne '+' en quelque chose dont je ne me soucie pas) – Rabarberski

+0

Il s'est avéré que certains fichiers bitmap (.ico) qui sont inclus dans le repo n'ont pas été copiés dans le changeset fichier correctif (qui semblait logique, avec le recul, puisqu'il s'agit seulement d'un fichier texte). Mais je n'étais pas sûr de pouvoir faire confiance à tous mes autres fichiers. Par conséquent, je me suis tourné vers le clonage du repo de la révision correcte vers un nouveau repo (en utilisant 'hg clone -r 14 repo repo-new') et j'ai réappliqué les changements manuellement. Pourtant, votre explication était très claire, et m'a donné une meilleure compréhension de mercurial. – Rabarberski

+0

Ça sonne bien. Je pense que les binaires (et les autorisations de fichiers) auraient été inclus si j'avais pensé à ajouter '--git' à l'export, que je vais insérer ci-dessus. Beaucoup d'entre nous ont [diff] \ ngit = true dans nos fichiers ~/.hgrc ce qui rend cela automatique, et j'oublie que ce n'est pas le comportement par défaut. –

1

Si ce n'est pas important pour ces 5 commits d'être soit des ensembles de changement indépendants, vous utilisez hg collapse pour les réduire à un ensemble unique de changement qui ne contient pas ces lignes que vous voulez éviter de pousser. Ie

  • Retirez le lignes que vous n'avez pas voulu inclure, puis validez ce changement
  • Utilisez hg collapse pour réduire les 6 derniers ensembles de modifications (le 5 existant local s, plus votre nouveau qui supprime simplement ces lignes)

Cela vous laissera avec un changement sur votre machine locale, qui ne contiendra pas les lignes que vous voulez éviter de pousser. Un mot d'avertissement, faites attention à utiliser hg collapse - vous voulez vous assurer de ne pas réduire les changements qui ont déjà été poussés vers un autre dépôt.

Questions connexes