bos@559: bos@559: bos@685: bos@572: andre@1018: Utilisation quotidienne de Mercurial bos@559: bos@559: andre@1018: Informer Mercurial des fichiers à suivre youshe@990: youshe@990: Mercurial ne suit pas les fichiers de votre dépôt tant youshe@990: que vous ne lui avez pas dit de les gérer. La commande hg status vous dira quels fichiers sont youshe@988: inconnus de Mercurial. Il utilise un youshe@988: ? pour montrer ces fichiers. youshe@988: youshe@988: Pour informer Mercurial de suivre un fichier, utilisez youshe@988: la commande hg add. Une fois que vous youshe@988: avez ajouté un fichier, la ligne correspondante à ce fichier dans la youshe@988: sortie de hg status change de youshe@988: ? à bos@567: A. bos@567: youshe@988: &interaction.daily.files.add; youshe@988: youshe@988: Après avoir exécuté un hg youshe@990: commit, les fichiers que vous avez ajoutés avant le commit youshe@990: ne seront plus listés dans la sortie de hg youshe@990: status. La raison de ceci est que, par défaut, hg status ne vous montre que les fichiers youshe@988: intéressants &emdash;ceux que vous avez (par exemple) andre@1018: modifiés, supprimés ou renommés. Si vous avez un dépôt qui contient un youshe@990: millier de fichiers, vous ne voudriez certainement que rarement entendre youshe@988: parler des fichiers que Mercurial suit, mais qui n'ont pas changés. youshe@988: (Vous pouvez quand même avoir cette information, nous y reviendrons youshe@988: plus tard.) youshe@988: youshe@988: Une fois que vous ajoutez un fichier, Mercurial ne fait youshe@990: rien du tout avec celui-ci immédiatement. Au lieu de ça, il va prendre youshe@988: un "snapshot" de l'état du fichier la prochaine fois que vous youshe@988: exécuterez un commit. Il continuera ensuite à suivre les changements youshe@990: que vous avez fait au fichier chaque fois que vous committerez, et ce, youshe@990: jusqu'à ce que vous supprimiez le fichier. youshe@988: youshe@988: youshe@988: Nommage des fichiers explicite versus implicite youshe@988: youshe@988: Un comportement utile que Mercurial possède est que si youshe@988: vous passez le nom d'un répertoire à une commande, toute commande youshe@990: Mercurial la traitera comme : Je veux opérer sur chaque fichier youshe@988: dans ce répertoire et ses sous-répertoires. bos@567: bos@567: &interaction.daily.files.add-dir; bos@567: youshe@988: Remarquez que dans cet exemple, Mercurial affiche le youshe@988: nom des fichiers qu'il a ajouté, alors qu'il ne l'a pas fait lorsque youshe@988: nous avons ajouté le fichier nommé myfile.txt youshe@988: dans l'exemple précédent. youshe@988: youshe@988: Ce qu'il se passe est que dans le premier cas, nous youshe@988: avons nommé explicitement le fichier à ajouter sur la ligne de youshe@990: commande. Ce que Mercurial suppose dans ce cas est que nous savons ce youshe@990: que nous faisons, il n'affiche donc rien en sortie. youshe@988: youshe@988: Cependant, lorsque nous avons youshe@988: implicitement donné les fichiers à l'aide du nom youshe@990: d'un répertoire, Mercurial prend l'initiative d'afficher le nom de youshe@988: chaque fichier avec lequel il fait quelque chose. Ceci clarifie ce youshe@990: qu'il se passe et réduit la probabilité d'une mauvaise surprise youshe@990: restée silencieuse. Ce comportement est commun à la plupart des youshe@990: commandes Mercurial. youshe@988: youshe@988: youshe@988: Mercurial suit les fichiers, pas les répertoires youshe@988: youshe@988: Mercurial ne suit pas les informations sur les youshe@990: répertoires. En contrepartie, il suit le chemin vers un fichier. Avant youshe@988: de créer un fichier, il crée au préalable les répertoires manquants youshe@988: dans le chemin. Après avoir supprimé un fichier, il supprime chaque youshe@988: répertoire vide qui apparaît dans le chemin du fichier. Ceci apparaît youshe@990: comme une distinction triviale, cependant, cela a une conséquence youshe@988: pratique mineure : il n'est pas possible de représenter un répertoire youshe@988: totalement vide dans Mercurial. youshe@988: youshe@988: Les répertoires vides sont rarement utiles. Il existe youshe@990: cependant des solutions alternatives et non intrusives que vous youshe@990: pouvez utiliser pour obtenir l'effet approprié. Les développeurs de youshe@990: Mercurial ont ainsi pensé que la complexité requise pour gérer les youshe@990: répertoires n'était pas aussi importante que le bénéfice que cette youshe@990: fonctionnalité apporterait. youshe@988: youshe@988: Si vous avez besoin d'un répertoire vide dans votre youshe@988: dépôt, il existe quelques façons d'y arriver. L'une d'elles est de youshe@990: créer un répertoire et ensuite, de faire un hg youshe@990: add sur un fichier caché dans ce youshe@990: répertoire. Sur les systèmes de type Unix, tout fichier dont le nom youshe@988: commence avec un point (.) est youshe@988: considéré comme caché par la plupart des commandes et outils youshe@990: graphiques. Cette approche est illustrée ci-après. youshe@988: youshe@988: &interaction.daily.files.hidden; youshe@988: youshe@988: Une autre façon de s'attaquer au besoin d'un youshe@990: répertoire vide est de simplement d'en créer un dans vos scripts youshe@988: de construction avant qu'ils n'en aient le besoin. bos@559: bos@559: bos@674: bos@559: youshe@988: Comment arrêter de suivre un fichier youshe@988: youshe@988: Une fois que vous décidez qu'un fichier n'appartient youshe@988: plus à votre dépôt, utilisez la commande hg youshe@988: remove. Ceci supprime le fichier et informe Mercurial youshe@988: d'arrêter de le suivre (ce qui prendra effet lors du prochain commit). youshe@988: Un fichier supprimé est représenté dans la sortie de la commande youshe@988: hg status par un bos@567: R. bos@567: bos@567: &interaction.daily.files.remove; bos@559: youshe@988: Après avoir fait un hg youshe@988: remove sur un fichier, Mercurial ne suivra plus aucun youshe@988: changement sur ce fichier, même si vous recréez un fichier avec le même youshe@990: nom dans votre répertoire de travail. Si vous recréez un fichier avec le youshe@988: même nom et que vous désirez que Mercurial suive ce dernier, faite youshe@988: simplement un hg add sur celui-ci. youshe@988: Mercurial saura alors que le nouveau fichier ne fait pas référence à youshe@988: l'ancien fichier qui portait le même nom. youshe@988: youshe@988: youshe@988: Supprimer un fichier n'affecte pas son historique youshe@988: youshe@990: Il est important de comprendre que supprimer un fichier youshe@988: n'a que deux effets. youshe@988: bos@559: youshe@988: Il supprime la version actuelle de ce youshe@988: fichier du répertoire de travail. youshe@988: youshe@988: Il arrête, à partir du prochain commit, le youshe@988: suivi de Mercurial sur les changements qui ont lieu sur ce youshe@988: fichier. youshe@988: youshe@988: youshe@988: Supprimer un fichier n'affecte en youshe@988: aucun cas l'historique du youshe@988: fichier. youshe@988: youshe@988: Si vous mettez à jour le répertoire de travail à un youshe@990: changeset qui a été committé alors que le fichier que vous venez de youshe@990: supprimer était encore suivi, ce fichier réapparaîtra dans le youshe@988: répertoire de travail, avec le contenu qu'il avait lorsque vous aviez youshe@990: committé ce changeset. Si vous mettez à jour (update) le répertoire de youshe@990: travail à un changeset ultérieur dans lequel le fichier a été youshe@988: supprimé, Mercurial supprimera une nouvelle fois le fichier du youshe@988: répertoire de travail. youshe@988: youshe@988: youshe@988: youshe@990: Fichiers manquants youshe@988: youshe@988: Mercurial considère qu'un fichier que vous avez youshe@988: supprimé sans utiliserhg remove youshe@988: comme étant manquant. Un fichier manquant est youshe@988: représenté avec un ! en sortie de youshe@988: hg status. youshe@988: Les commandes Mercurial ne feront rien avec les fichiers youshe@988: manquants. bos@567: bos@567: &interaction.daily.files.missing; bos@559: youshe@988: Si votre dépôt contient un fichier que hg status reporte comme manquant, et que youshe@988: vous voulez que ce fichier reste supprimé, vous pouvez exécuter youshe@988: hg remove à tout moment youshe@988: pour dire à Mercurial que vous aviez bien voulu supprimer ce youshe@988: fichier. bos@567: bos@567: &interaction.daily.files.remove-after; bos@559: andre@1018: D'un autre côté, si vous avez supprimé le fichier youshe@988: manquant par accident, donnez à la commande hg youshe@990: revert le nom du fichier à retrouver. Il réapparaitra dans youshe@988: sa forme non modifiée. bos@559: bos@674: &interaction.daily.files.recover-missing; youshe@988: youshe@988: youshe@988: youshe@988: andre@1018: Aparté : Pourquoi dire explicitement à Mercurial de supprimer un youshe@988: fichier ? andre@1018: youshe@988: Vous pourriez vous demander pourquoi il est nécessaire youshe@990: de dire explicitement à Mercurial que vous souhaitez supprimer un youshe@988: fichier. Au début du développement de Mercurial, celui ci vous andre@1018: laissait pourtant supprimer un fichier sans souci ; Mercurial vous youshe@988: aurait automatiquement informé de l'absence du fichier lorsque vous youshe@988: auriez lancé un hg commit et arrêté youshe@988: de le suivre. En pratique, ceci a montré qu'il était trop facile de youshe@988: supprimer accidentellement un fichier sans le remarquer. youshe@988: youshe@988: youshe@988: youshe@990: Raccourci utile&emdash;ajouter et supprimer des fichiers en une youshe@988: seule étape. youshe@988: youshe@988: Mercurial offre une commande combinée, hg addremove, qui ajoute les fichiers non youshe@988: suivis et marque les fichiers manquants comme supprimés. bos@567: bos@567: &interaction.daily.files.addremove; bos@567: youshe@988: La commande hg commit youshe@988: fournit aussi une option qui youshe@988: exécute le même ajouter-et-supprimer, immédiatement suivi d'un youshe@988: commit. bos@567: bos@567: &interaction.daily.files.commit-addremove; youshe@988: bos@559: bos@559: bos@674: bos@701: youshe@988: Copier des fichiers youshe@988: youshe@988: Mercurial fournit une commande hg youshe@988: copy qui vous permet de faire une nouvelle copie d'un youshe@988: fichier. Lorsque vous copiez un fichier en utilisant cette commande, youshe@988: Mercurial crée un enregistrement du fait que ce nouveau fichier est une youshe@988: copie du fichier originel. Il traite ces fichiers copiés spécialement youshe@990: lorsque vous fusionnez (merge) votre travail avec quelqu'un youshe@988: d'autre. youshe@988: youshe@988: youshe@990: Les résultats d'une copie durant une fusion (merge) youshe@988: youshe@988: Ce qu'il se passe durant une fusion (merge) est que youshe@988: les changements suivent une copie. Pour illustrer ce youshe@990: que cela veut dire de la meilleure façon, créons un exemple. Nous youshe@988: allons commencer avec le mini dépôt usuel qui contient un simple youshe@988: fichier. bos@567: bos@567: &interaction.daily.copy.init; bos@567: youshe@988: Nous devons faire du travail en parallèle, ainsi, youshe@988: nous aurons quelque chose à fusionner (merge). Donc clonons notre youshe@988: dépôt. bos@567: bos@567: &interaction.daily.copy.clone; bos@567: youshe@988: De retour dans notre dépôt initial, utilisons la youshe@988: commande hg copy pour faire une youshe@988: copie du premier fichier que nous avons créé. bos@567: bos@567: &interaction.daily.copy.copy; bos@559: youshe@988: Si nous regardons ensuite à la sortie de la commande youshe@988: hg status, les fichiers copiés youshe@988: ont l'air de fichiers normalement ajoutés. bos@567: bos@567: &interaction.daily.copy.status; bos@567: youshe@988: Mais si nous passons l'option à hg youshe@988: status, il affiche une autre ligne de sortie : il s'agit youshe@988: du fichier source pour notre copie. bos@567: bos@567: &interaction.daily.copy.status-copy; bos@559: youshe@988: Maintenant, de retour dans le dépôt que nous avons youshe@990: cloné, créons un changement en parallèle. Nous allons ajouter une youshe@988: ligne de contenu au fichier original qui a été créé. bos@567: bos@567: &interaction.daily.copy.other; bos@567: youshe@990: Nous avons alors un fichier file youshe@990: modifié dans ce dépôt. Lorsque nous récupérons (pull) les changements youshe@990: depuis le premier répertoire et fusionnons (merge) les deux "heads", youshe@990: Mercurial propagera les changements que nous avons faits localement youshe@990: au fichier file dans sa copie youshe@988: new-file. bos@567: bos@567: &interaction.daily.copy.merge; youshe@988: youshe@988: bos@559: andre@1018: Pourquoi les changements devraient-ils suivre les copies ? andre@1018: andre@1018: Ce comportement&emdash;des changements d'un fichier youshe@988: qui se propagent aux copies de ce fichier&emdash;peut sembler andre@1018: ésotérique, mais, dans la plupart des cas, c'est fortement andre@1018: souhaitable. andre@1018: andre@1018: Pour commencer, souvenez-vous que cette propagation andre@1018: a lieu seulement lors des fusions (merge). youshe@988: Donc, si vous faites un hg copy sur youshe@988: un fichier, et par la suite modifiez le fichier original durant le andre@1018: cours normal de votre travail, rien n'aura lieu. andre@1018: andre@1018: La deuxième chose à savoir est que les modifications youshe@988: ne se propageront à travers une copie que si le changeset à partir youshe@988: duquel vous faites une fusion (merge) n'a pas encore youshe@988: vu la copie. youshe@988: youshe@988: La raison pour laquelle Mercurial fait ainsi est une youshe@990: règle. Imaginons que je corrige un important bug dans un fichier source youshe@990: et que je commit mes changements. Pendant ce temps, vous avez décidé de youshe@988: faire un hg copy du fichier dans youshe@990: votre dépôt, sans rien savoir au sujet du bug ou à propos de la youshe@990: correction. Vous avez alors commencé à "hacker" sur votre copie du youshe@990: fichier. youshe@988: youshe@988: Si vous aviez récupéré (pull) et fusionné (merge) mes youshe@988: changements, et que Mercurial n'avait pas youshe@988: propagé les changements à travers les copies, votre nouveau fichier youshe@990: source contiendrait maintenant le bug, et à moins que vous ne sachiez youshe@988: qu'il faille propager la correction du bug à la main, le bug aurait youshe@988: subsisté dans votre copie du fichier. youshe@988: youshe@988: En propageant automatiquement les changements qui youshe@988: fixent les bugs à partir du fichier original vers les copies, andre@1018: Mercurial prévient ce type de problèmes. À ma connaissance, Mercurial youshe@988: est le seul système de gestion de révisions qui youshe@988: propage les changements à travers les copies comme ceci. youshe@988: youshe@988: Une fois que votre historique des changements a un youshe@990: enregistrement concernant une copie et qu'une fusion postérieure a andre@1018: eu lieu, il n'y a d'habitude pas d'autre besoin de propager les youshe@990: changements du fichier originel vers le fichier copié. C'est pourquoi youshe@990: Mercurial ne propage les changements à travers les copies qu'à la andre@1018: première fusion, et pas après. youshe@988: youshe@988: youshe@988: youshe@988: Comment faire des changements qui <emphasis>ne</emphasis> youshe@988: suivent <emphasis>pas</emphasis> une copie youshe@988: youshe@988: Si pour une raison ou une autre, vous décidez que youshe@988: cette fonctionnalité de propager automatiquement les changements à youshe@988: travers les copies n'est pas pour vous, utilisez simplement la youshe@988: commande normale de copie de votre système (sur les systèmes de type youshe@988: Unix, il s'agit de cp) pour faire une copie d'un youshe@988: fichier. Utilisez ensuite hg add youshe@988: pour ajouter les nouveaux fichiers à la main. Cependant, avant d'en youshe@988: faire ainsi, relisez , et faites youshe@990: un choix en connaissance de cause comme quoi cette fonctionnalité youshe@990: n'est pas appropriée à votre cas spécifique. youshe@988: youshe@988: youshe@988: youshe@988: Comportement de la commande <command role="hg-cmd">hg copy</command> youshe@988: youshe@988: Lorsque vous utilisez la commande hg copy, Mercurial crée une copie de chaque youshe@988: fichier source tel qu'il est actuellement dans le répertoire de youshe@990: travail. Cela signifie que si vous effectuez des modifications sur un youshe@988: fichier, puis faites un hg copy sur youshe@990: celui-ci sans avoir au préalable committé ces changements, la nouvelle youshe@988: copie contiendra aussi les modifications que vous avez fait jusqu'à youshe@990: ce point. (Je trouve ce comportement quelque peu contre intuitif, youshe@990: c'est pourquoi j'en fais mention ici.) youshe@990: youshe@988: youshe@988: La commande hg copy youshe@988: agit comme la commande Unix cp (vous pouvez youshe@988: utilisez l'alias hg cp si vous youshe@988: préférez). Nous devons lui donner deux ou plus arguments où le youshe@988: dernier est considéré comme la destination, et youshe@988: les autres comme les sources. youshe@988: youshe@988: Si vous passez à hg youshe@988: copy un seul fichier source, et que la destination youshe@988: n'existe pas, ceci créera un nouveau fichier avec ce nom. bos@567: bos@567: &interaction.daily.copy.simple; youshe@988: youshe@988: Si la destination est un répertoire, Mercurial copie youshe@988: les sources dans ce répertoire. bos@567: bos@567: &interaction.daily.copy.dir-dest; bos@567: youshe@988: La copie de répertoire est récursive et préserve la youshe@988: structure du répertoire source. bos@567: bos@567: &interaction.daily.copy.dir-src; bos@567: youshe@988: Si la source et la destination sont tous deux des youshe@990: répertoires, l'arborescence de la source est recréée dans le youshe@988: répertoire destination. youshe@988: youshe@988: &interaction.daily.copy.dir-src-dest; youshe@988: youshe@988: Comme avec la commande hg youshe@988: remove, si vous copiez un fichier manuellement et voulez youshe@988: que Mercurial sache qu'il s'agit d'une copie, utilisez simplement youshe@988: l'option avec hg copy. bos@567: bos@567: &interaction.daily.copy.after; bos@559: bos@559: bos@674: bos@559: youshe@988: Renommer les fichiers youshe@988: youshe@988: Il est plus commun d'avoir besoin de renommer un youshe@988: fichier que d'en faire une copie. La raison pour laquelle j'ai discuté youshe@988: de la commande hg copy avant de parler youshe@988: de renommage des fichiers est que Mercurial traite les renommages youshe@990: essentiellement comme une copie. Ainsi, savoir comment Mercurial traite youshe@988: les copies de fichiers vous informe sur ce que vous êtes en droit youshe@988: d'attendre lorsque vous renommez un fichier. youshe@988: youshe@988: Lorsque vous utilisez la commande hg rename, Mercurial crée une copie de tous youshe@990: les fichiers sources, les supprime et marque ces fichiers comme étant youshe@988: supprimés. youshe@988: youshe@988: &interaction.daily.rename.rename; youshe@988: youshe@988: La commande hg status youshe@990: montre les nouveaux fichiers comme ajoutés et les fichiers originaux youshe@990: comme supprimés. bos@567: bos@567: &interaction.daily.rename.status; bos@567: andre@1018: À cause du hg copy, youshe@988: nous devons utiliser l'option youshe@990: pour la commande hg status afin youshe@990: d'observer que le fichier ajouté est bien suivi par Mercurial comme youshe@990: étant une copie de l'original maintenant supprimé. bos@567: bos@567: &interaction.daily.rename.status-copy; bos@559: youshe@988: Comme avec hg remove et youshe@988: hg copy, vous pouvez informer andre@1018: Mercurial d'un renommage après coup en utilisant l'option andre@1018: . Dans la plupart des autres andre@1018: situations, le comportement de la commande hg andre@1018: rename, et les options qu'elle accepte sont similaires à la youshe@988: commande hg copy. youshe@988: youshe@990: Si vous êtes familier avec la ligne de commande Unix, youshe@988: vous serez heureux d'apprendre que la commande hg rename peut être invoquée par hg mv. youshe@988: youshe@988: youshe@988: Renommer les fichiers et fusionner (merge) les changements youshe@988: andre@1018: Puisque le rename de Mercurial est implanté comme un andre@1018: copy-and-remove, la même propagation des changements a lieu après andre@1018: un rename qu'après un copy lorsque vous fusionnez (merge). youshe@988: youshe@988: Si je modifie un fichier et que vous le renommez, si youshe@988: ensuite nous fusionnons nos changements respectifs, mes modifications youshe@988: sur le fichier sous son nom originel seront propagés vers le même youshe@988: fichier sous son nouveau nom. (C'est quelque chose que vous pourriez youshe@988: espérer voir fonctionner simplement, mais tous les youshe@988: systèmes de gestion de version ne le font pas.) youshe@988: youshe@988: Tandis qu'avoir des changements qui suivent une copie youshe@988: est une fonctionnalité où vous hocheriez sûrement la tête en disant youshe@988: oui, cela pourrait être utile, il est clair que les andre@1018: voir suivre un renommage est sans aucun doute important. Sans cette andre@1018: facilité, il serait vraiment trop facile d'avoir des changements youshe@988: qui deviennent orphelins lorsque des fichiers sont renommés. youshe@988: youshe@988: youshe@988: youshe@988: Renommages divergeants et fusion (merge) youshe@988: youshe@988: Le cas de noms divergeants a lieu lorsque deux youshe@990: développeurs commencent avec un fichier&emdash;appelons le youshe@988: foo&emdash;dans leurs dépôts respectifs. bos@559: bos@567: &interaction.rename.divergent.clone; bos@567: youshe@988: Anne renomme le fichier en youshe@988: bar. bos@567: bos@567: &interaction.rename.divergent.rename.anne; bos@567: youshe@988: Pendant ce temps, Bob le renomme en andre@1018: quux. (Souvenez-vous que hg mv est un alias pour hg rename.) youshe@988: youshe@988: &interaction.rename.divergent.rename.bob; youshe@988: youshe@988: J'aime à penser qu'il s'agit d'un conflit puisque youshe@988: chaque développeur a exprimé différentes intentions au sujet de ce youshe@988: que le nom de ce fichier aurait du être. youshe@988: andre@1018: Que pensez-vous qu'il devrait se produire lorsqu'ils youshe@988: fusionnent (merge) leurs travaux ? Le comportement actuel de youshe@988: Mercurial est qu'il préserve toujours les deux youshe@988: noms lorsqu'il fusionne (merge) des changesets qui contiennent des youshe@988: renommages divergeants. bos@567: bos@567: &interaction.rename.divergent.merge; bos@559: youshe@988: Remarquez que bien que Mercurial vous avertisse au youshe@988: sujet de la divergeance des renommages, il vous laisse faire quelque andre@1018: chose au sujet de la divergence après la fusion (merge). youshe@988: youshe@988: youshe@988: youshe@988: Renommages et fusion convergeants youshe@988: youshe@988: Un autre type de conflit de renommage intervient andre@1018: lorsque deux personnes choisissent de renommer différents fichiers youshe@988: source vers la même youshe@988: destination. Dans ce cas, Mercurial exécute la youshe@988: machinerie normale de fusion (merge) et vous guide vers une youshe@988: solution convenable. youshe@988: youshe@988: youshe@988: andre@1018: Autres cas épineux relatifs aux noms youshe@988: youshe@988: Mercurial possède un bug de longue date dans lequel il andre@1018: échoue à traiter une fusion (merge) où un côté a un fichier avec un andre@1018: nom donné, alors que l'autre côté possède un répertoire avec le même nom. youshe@988: Ceci est documenté dans l'issue youshe@988: 29. bos@567: bos@567: &interaction.issue29.go; bos@559: bos@559: bos@559: bos@559: youshe@988: Récupération d'erreurs youshe@988: youshe@988: Mercurial possède certaines commandes utiles qui vont youshe@990: vous aider à récupérer de certaines erreurs communes. youshe@988: youshe@988: La commande hg revert youshe@990: vous permet d'annuler les changements que vous avez faits dans votre youshe@988: répertoire de travail. Par exemple, si vous faites un hg add sur un fichier par accident, exécutez andre@1018: juste hg revert avec le nom du fichier youshe@990: que vous avez ajouté et tandis que le fichier ne sera touché d'une youshe@988: quelconque manière, il ne sera plus suivi comme ajouté par Mercurial. youshe@988: Vous pouvez aussi utiliser la commande hg andre@1018: revert pour vous débarrasser de modifications erronées youshe@988: apportées à un fichier. youshe@988: youshe@988: Il est utile de se souvenir que la commande hg revert est utile pour les modifications youshe@990: qui n'ont pas encore été committées. Une fois que vous avez committé un youshe@988: changement, si vous décidez qu'il s'agissait d'une erreur, vous pouvez youshe@990: toujours faire quelque chose à ce sujet, bien que vos options soient youshe@988: un peu plus limitées. youshe@988: youshe@988: Pour plus d'informations au sujet de la commande youshe@988: hg revert, et des détails sur comment youshe@988: traiter les modifications que vous avez déjà committées, référez vous à youshe@988: . bos@674: bos@674: bos@674: youshe@988: Traiter avec les fusions (merge) malicieuses youshe@988: youshe@988: Dans des projets compliqués ou conséquents, il n'est pas youshe@988: rare qu'une fusion (merge) de deux changesets finisse par une migraine. youshe@990: Supposez qu'il y ait un gros fichier source qui ait été largement édité de youshe@988: chaque coté de la fusion (merge) : ceci va inévitablement résulter en youshe@990: conflits, dont certains peuvent prendre plusieurs essais pour s'en youshe@988: sortir. youshe@988: youshe@990: Développons en un cas simple pour voir comment le gérer. youshe@990: Nous allons commencer avec un dépôt contenant un fichier, et le youshe@988: cloner deux fois. bos@674: bos@674: &interaction.ch04-resolve.init; bos@674: youshe@988: Dans un des clones, nous allons modifier le fichier youshe@988: d'une façon. bos@674: bos@674: &interaction.ch04-resolve.left; bos@674: youshe@988: Dans un autre, nous allons modifier le fichier youshe@990: différemment. bos@674: bos@674: &interaction.ch04-resolve.right; bos@674: youshe@988: Ensuite, nous allons récupérer (pull) chaque ensemble de youshe@988: changement dans notre dépôt original. bos@674: bos@674: &interaction.ch04-resolve.pull; bos@674: youshe@988: Nous nous attendons à ce que notre dépôt contienne deux youshe@990: "heads". bos@674: bos@674: &interaction.ch04-resolve.heads; bos@674: youshe@988: Normalement, si nous lançons hg youshe@988: merge à ce point, il nous renverra vers une interface youshe@988: utilisateur qui nous permettra de résoudre manuellement les éditions youshe@988: conflictuelles sur le fichier myfile.txt. youshe@990: Cependant, pour simplifier ici les choses dans la présentation, nous youshe@990: aimerions plutôt que la fusion (merge) échoue immédiatement. Voici une youshe@988: façon de le faire. bos@674: bos@674: &interaction.ch04-resolve.export; bos@674: youshe@990: Nous avons dit au processus de fusion de Mercurial youshe@988: d'exécuter la commande false (qui échoue youshe@988: immédiatement, à la demande) s'il détecte une fusion (merge) qu'il ne youshe@988: peut pas arranger automatiquement. youshe@988: youshe@988: Si nous appelons maintenant hg youshe@990: merge, il devrait échouer et reporter une erreur. bos@674: bos@674: &interaction.ch04-resolve.merge; bos@674: youshe@988: Même si nous ne remarquons pas qu'une fusion (merge) a youshe@990: échoué, Mercurial nous empêchera de committer le résultat d'une fusion youshe@988: ratée. bos@674: bos@674: &interaction.ch04-resolve.cifail; bos@674: youshe@988: Lorsque hg commit youshe@988: échoue dans ce cas, il suggère que nous utilisons la commande peu andre@1018: connue hg resolve. Comme d'habitude, youshe@988: hg help resolve affichera une aide youshe@988: sommaire. bos@674: bos@674: youshe@990: États de résolution des fichiers youshe@989: youshe@989: youshe@990: Lorsqu'une fusion intervient, la plupart des fichiers youshe@989: vont, la plupart du temps, rester sans modification. Pour chaque youshe@989: fichier sur lequel Mercurial doit faire quelque chose, il suit l'état youshe@989: de celui-ci. bos@674: bos@674: youshe@989: Un fichier youshe@989: resolved a été fusionné youshe@989: (merge) avec succès, que ce soit automatiquement par Mercurial ou youshe@989: manuellement par une intervention humaine. youshe@989: Un fichier youshe@989: unresolved n'a pas été youshe@989: fusionné (merge) correctement et a besoin de plus youshe@989: d'attention. youshe@989: bos@674: bos@674: youshe@990: Si Mercurial voit un fichier youshe@990: quelconque dans un état youshe@990: unresolved après une fusion (merge), il considère que youshe@990: la fusion (merge) a échoué. Heureusement, nous n'avons pas à youshe@990: recommencer la procédure à partir du début. youshe@989: youshe@989: L'option youshe@989: ou passée à hg resolve liste l'état de chaque fichier youshe@989: fusionné (merge). bos@674: bos@674: &interaction.ch04-resolve.list; bos@674: youshe@989: En sortie de hg andre@1018: resolve, un fichier resolved est marqué avec un andre@1018: R, alors qu'un fichier unresolved est marqué youshe@989: d'un U. S'il existe un fichier listé avec un youshe@989: U, nous savons qu'essayer de committer le résultat youshe@990: de la fusion (merge) échouera. youshe@989: youshe@989: youshe@989: youshe@989: Résoudre une fusion de fichier youshe@989: youshe@989: Nous avons plusieurs options pour changer l'état d'un andre@1018: fichier de unresolved à resolved. andre@1018: Le plus habituel est de relancer youshe@989: hg resolve. Si nous passons les noms youshe@989: des fichiers individuels ou des répertoires, ceci retentera la fusion youshe@989: de tous les fichiers présents à cet endroit. Nous pouvons aussi youshe@989: passer l'option ou youshe@989: qui tentera de fusionner andre@1018: tous les fichiers unresolved. youshe@989: youshe@989: Mercurial nous laisse aussi modifier la résolution andre@1018: d'un fichier directement. Nous pouvons marquer un fichier resolved youshe@989: en utilisant l'option , andre@1018: ou unresolved en utilisant l'option . Ceci nous autorise à youshe@990: nettoyer une fusion particulièrement compliquée à la main, et de youshe@989: garder un suivi de nos progrès avec chaque fichier pendant que nous andre@1018: avançons. bos@674: bos@559: bos@683: bos@683: andre@1018: Des <quote>diffs</quote> plus utiles youshe@989: youshe@989: La sortie par défaut de la commande hg diff est compatible rétrospectivement avec youshe@990: la commande régulière diff, mais ceci a quelques youshe@990: inconvénients. youshe@989: youshe@989: Considérez le cas où nous utilisons hg youshe@989: rename pour renommer un fichier. bos@683: bos@683: &interaction.ch04-diff.rename.basic; bos@683: youshe@990: La sortie de hg diff youshe@990: ci-dessus cache le fait que nous avons simplement renommé un fichier. youshe@990: La commande hg diff accepte l'option youshe@989: ou pour utiliser un nouveau youshe@989: format de diff qui montre ces informations sous une forme plus youshe@989: expressive. bos@683: bos@683: &interaction.ch04-diff.rename.git; bos@683: andre@1018: Cette option peut aussi aider avec le cas qui peut être autrement andre@1018: perturbant : un fichier qui apparaît comme étant modifié en accord avec youshe@989: hg status, mais où hg diff n'affiche rien. Cette situation peut youshe@989: survenir si nous changeons les permissions d'exécution du youshe@989: fichier. bos@683: bos@683: &interaction.ch04-diff.chmod; bos@683: youshe@989: La commande normale diff ne fait pas youshe@989: attention aux permissions des fichiers, ce qui explique pourquoi youshe@989: hg diff n'affiche rien du tout par youshe@989: défaut. Si nous lui passons l'option , ceci nous andre@1018: informe de ce qui s'est vraiment passé. bos@683: bos@683: &interaction.ch04-diff.chmod.git; bos@683: bos@683: bos@683: youshe@990: Quels fichiers suivre et lesquels éviter youshe@989: youshe@989: Les systèmes de gestion de révisions sont en général youshe@989: meilleurs pour gérer les fichiers textes qui sont écrits par les youshe@989: humains, comme le code source, où les fichiers ne changent pas youshe@989: énormément d'une révision à l'autre. Certains systèmes de gestion de youshe@990: révisions centralisés peuvent aussi traiter très convenablement les youshe@990: fichiers binaires, tels que les images bitmap. youshe@989: youshe@989: Par exemple, une équipe de développement de jeux va youshe@990: probablement gérer les deux types : ses codes source et tous ses binaires youshe@989: (ex. données géométriques, textures, schémas de cartes) dans un système youshe@989: de contrôle de révisions. youshe@989: youshe@989: youshe@989: Puisqu'il est d'habitude impossible de fusionner (merge) youshe@989: deux modifications conflictuelles sur un fichier binaire, les systèmes youshe@990: de version centralisés offrent souvent un mécanisme de verrou (lock) qui youshe@989: permet à un utilisateur de dire Je suis la seule personne qui youshe@989: peut éditer ce fichier. youshe@989: youshe@990: En comparaison avec un système centralisé, un système youshe@989: décentralisé de gestion de révision change certains facteurs qui youshe@989: guident les décisions sur quels fichiers gérer et comment. youshe@989: youshe@990: Par exemple, un système distribué de gestion de révisions andre@1018: ne peut pas, par sa nature, offrir un système de verrou (lock) sur les youshe@990: fichiers. Il n'y a donc pas de mécanisme inclus pour empêcher deux youshe@989: personnes de faire des modifications conflictuelles sur un fichier youshe@989: binaire. Si vous avez une équipe où plusieurs personnes peuvent souvent youshe@989: éditer un fichier binaire, cela ne serait pas une très bonne idée youshe@990: d'utiliser Mercurial &emdash;ou tout autre système distribué de gestion youshe@989: de révisions&emdash;pour gérer ces fichiers. youshe@989: youshe@989: Lorsque vous sauvegardez les modifications sur un youshe@989: fichier, Mercurial ne sauvegarde d'habitude que les différences entre youshe@989: la version précédente et la version actuelle d'un fichier. Pour la youshe@989: plupart des fichiers texte, ceci est très efficace. Cependant, certains youshe@989: fichiers (en particulier les fichiers binaires) sont construits d'une youshe@989: façon que même un petit changement sur un contenu logique résulte sur youshe@989: un changement de la plupart des octets du fichier. Par exemple, les youshe@990: fichiers compressés sont particulièrement sujets à ce comportement. Si youshe@990: les différences entre deux versions successives d'un fichier sont youshe@990: toujours très grandes, Mercurial ne sera pas capable de sauvegarder youshe@990: l'historique des révisions sur le fichier très efficacement. Ceci peut youshe@990: affecter aussi bien les besoins pour la sauvegarde locale que le temps youshe@990: nécessaire à cloner le dépôt. youshe@989: youshe@989: Pour avoir une idée de comment ceci pourrait vous youshe@989: affecter en pratique, supposez que nous voulions que Mercurial gère des youshe@989: documents OpenOffice. OpenOffice sauvegarde les documents sur le disque youshe@989: comme des fichiers compressés zip. Même le fait d'éditer ces fichiers youshe@989: d'une seule lettre, changera les bits de la quasi totalité du fichier youshe@989: lorsque vous le sauvegarderez. Maintenant, supposez que ce fichier andre@1018: fasse une taille de 2 Mo. Puisque la plupart du fichier change à chaque andre@1018: fois que vous sauvegardez, Mercurial aura à sauvegarder tous les 2 Mo du youshe@989: fichier à chaque commit, alors que de votre point de vue, il n'y a youshe@990: que peu de mots qui changent à chaque fois. Un seul fichier youshe@990: souvent édité qui n'est pas bien traité par les hypothèses que Mercurial youshe@989: fait sur les sauvegardes peut facilement avoir un effet colossal sur la youshe@989: taille du dépôt. youshe@989: youshe@989: Même pire, si vous et quelqu'un d'autre éditez le même youshe@989: document OpenOffice sur lequel vous travaillez, il n'y a pas de façon youshe@989: utile pour fusionner votre travail. En fait, il n'y a pas de moyen youshe@989: utile de montrer que les différences sont faites à partir de votre youshe@989: vision des modifications. youshe@989: youshe@990: Il y a ainsi quelques recommandations claires sur les youshe@989: types de fichiers spécifiques avec lesquels faire très youshe@989: attention. bos@683: bos@683: youshe@989: Les fichier qui sont très gros et youshe@990: incompressibles, comme les images ISO de CD-ROM, sont, par youshe@989: construction très gros et les cloner à travers un réseau sera très youshe@989: long. youshe@990: youshe@989: Les fichiers qui changent beaucoup d'une andre@1018: révision à l'autre peuvent être très coûteux à sauvegarder si vous youshe@990: les éditez fréquemment, de même que les conflits entre deux éditions youshe@989: concurrentes peuvent être difficiles à résoudre. bos@683: bos@683: bos@683: bos@683: bos@683: youshe@989: Sauvegardes et miroirs youshe@989: youshe@989: Puisque Mercurial maintient une copie complète de youshe@989: l'historique de chaque clone, toute personne qui utilise Mercurial pour youshe@989: collaborer à un projet peut potentiellement agir comme une source de youshe@990: sauvegarde si une catastrophe survenait. Si un dépôt central devient youshe@989: indisponible, vous pouvez construire un remplaçant en clonant une copie youshe@989: du dépôt à partir d'un des contributeurs en récupérant (pull) tous les youshe@989: changements qui n'auraient pas été vus par les autres. youshe@989: youshe@989: Il est simple d'utiliser Mercurial pour construire des youshe@989: serveurs hors site de sauvegarde et des miroirs distants. Initiez une youshe@989: tâche périodique (ex. via la commande cron) sur un youshe@989: serveur distant pour récupérer (pull) les changements de votre dépôt youshe@990: distant chaque heure. Ceci sera difficile seulement dans le cas youshe@989: improbable où le nombre des dépôts maîtres que vous maintenez change youshe@989: souvent, auquel cas vous aurez besoin de faire un peu de scripting pour andre@1018: rafraichir la liste des dépôts à sauvegarder. youshe@989: youshe@989: Si vous exécutez des sauvegardes traditionnelles de youshe@990: votre dépôt maître sur bande ou disque, et que vous voulez sauvegarder youshe@990: un dépôt nommé myrepo, utilisez la commande youshe@990: hg clone -U myrepo myrepo.bak pour créer un clone de youshe@990: myrepo avant de commencer vos backups. youshe@989: L'option ne crée pas de répertoire de travail après youshe@989: que le clone soit accompli, puisque ceci serait superflu et ferait que youshe@989: la sauvegarde prenne plus de temps. youshe@989: youshe@989: Si vous voulez ensuite sauvegarder youshe@989: myrepo.bak au lieu de myrepo, andre@1018: vous aurez la garantie d'avoir une image (snapshot) cohérente de youshe@990: votre dépôt sur lequel un développeur insomniaque n'enverra (push) pas de youshe@989: changements en milieu de sauvegarde. bos@683: bos@559: bos@559: bos@559: