Combiner magit avec undo-tree pour une navigation facile dans l'historique


16

J'adore undo-tree(capture d'écran ci-dessous). Il fournit un moyen facile de naviguer dans les différentes versions d'un fichier (fenêtre du haut) en laissant l'utilisateur se déplacer dans l'arborescence de l'historique du fichier dans une fenêtre séparée (fenêtre du bas) avec des touches simples telles que n, pet C-bet C-fpour basculer entre les descendants du même parent.

Plus particulièrement, undo-treemet automatiquement à jour le tampon contenant le fichier avec la version correspondante en fonction de la sélection dans l'arborescence.

Bien sûr, magitc'est phénoménal pour git, et ce serait étonnant s'il avait une capacité similaire, c'est-à-dire permettre aux utilisateurs de parcourir l' historique git d' un fichier de manière interactive tout en mettant à jour simultanément le tampon contenant le fichier automatiquement.

Est-ce que cela est possible avec magitaujourd'hui?

entrez la description de l'image ici


Je ne sais pas si c'est possible avec magit mais jetez un œil sur github.com/pidu/git-timemachine
clemera

Je ne suis pas sûr, mais je pense qu'il undo-treeutilise un arbre (c'est dans le nom :-p), alors que l'histoire de Git est un graphe acyclique dirigé . Ce pourrait être non trivial.
suvayu

2
Magit prend en charge quelque chose comme ça, mais je modifie actuellement la façon dont la fonctionnalité est activée. Je posterai une réponse quand j'aurai fini avec ça.
tarsius

Réponses:


7

Magit a récemment pris en charge quelque chose comme ça, mais la fonctionnalité est encore un peu approximative et doit être activée explicitement.


Une fonctionnalité similaire existe depuis longtemps - lorsque vous passez d'une validation à une autre dans un tampon de journal et qu'une autre fenêtre dans le même cadre est le tampon de révision du référentiel, ce tampon est actualisé pour afficher cette validation au lieu de la valider. montrait précédemment.

Jusqu'à très récemment, le tampon de révision était créé lorsque vous passiez pour la première fois d'un commit à un autre. J'ai changé ce comportement et maintenant le tampon de révision est seulement mis à jour . Si aucune fenêtre dans le même cadre n'affiche déjà ce tampon, le déplacement dans le journal n'entraînera plus l'affichage du tampon dans une nouvelle fenêtre ou une fenêtre existante qui affichait auparavant un autre tampon.

Alors maintenant, vous devez appuyer SPCune fois pour afficher le tampon de révision. Ce n'est qu'alors qu'il commencera à être mis à jour lorsque vous vous déplacerez dans le tampon de journal.

Si vous ne souhaitez pas que le tampon de révision soit mis à jour, procédez comme suit:

(remove-hook 'magit-section-movement-hook
             'magit-log-maybe-update-revision-buffer)

Si, d'autre part, vous souhaitez également que le tampon de révision soit mis à jour lorsque vous vous déplacez dans le tampon d'état, utilisez ceci:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-revision-buffer)

Il est désormais possible de mettre à jour automatiquement un tampon blob de la même manière. Ajoutez d'abord ceci:

(add-hook 'magit-section-movement-hook
          'magit-log-maybe-update-blob-buffer)

Et peut-être aussi:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-blob-buffer)

Ensuite, à l'intérieur d'un tampon de journal (ou d'état), appuyez sur RETpour afficher ou mettre à jour le tampon de révision et pour basculer également sur ce tampon. Accédez au fichier qui vous intéresse et appuyez à RETnouveau sur. Vous êtes maintenant dans un tampon de "visite de blob", qui est similaire à un tampon de visite de fichier, sauf qu'il ne visite pas le fichier dans l'arborescence de travail mais le fichier tel qu'il était dans une validation.

Revenez au tampon de journal (ou d'état) et passez à un autre commit. Le tampon blob est en cours de mise à jour.


Notez que l'affichage d'un autre blob ne réutilise pas réellement le tampon de blob existant. Au lieu de cela, il crée un nouveau tampon qui visite cet objet blob, puis affiche ce tampon dans la fenêtre qui affichait précédemment l'autre tampon blob. Cet autre tampon n'est pas supprimé, ce qui signifie malheureusement que pas mal de tampons peuvent s'accumuler en peu de temps. Ce serait l'un de ces bords rugueux, je l'ai mentionné plus tôt. Appuyer qsur un tampon blob le supprime, vous pouvez donc nettoyer en allant dans la fenêtre qui a été utilisée pour afficher les différents tampons blob et continuer à appuyer qjusqu'à ce que tous les tampons aient été supprimés.

De plus, il est possible de naviguer vers le blob suivant ou précédent à partir d'un tampon de blob à l'aide de pet n. Je suppose que dans la plupart des cas, vous commencez avec un blob récent, puis revenez en arrière vers des blobs plus anciens en utilisant p. Si vous faites cela et que vous souhaitez ensuite vous déplacer dans l'autre sens, je vous recommande d'utiliser qpour tuer le tampon actuel et ainsi passer au tampon précédent , c'est-à-dire au prochain blob.

Notez également que vous n'avez pas besoin de visiter d'abord une révision pour pouvoir visiter un blob. Vous pouvez également utiliser M-x magit-find-file RET <revision> RET <file> RETdirectement, mais je trouve cela moins pratique.


Merci tarsius. Je travaille avec magit 20151014.231(la dernière pour autant que je sache ). J'ai essayé de suivre les étapes décrites ci-dessus. Je suis allé à magit-log-buffer-filece qui me permet de naviguer dans les commits de haut en bas avec net pmais quand j'appuie sur SPCou RETsur l'un d'eux j'obtiens:Symbol's value as variable is void: magit-blame-mode
Amelio Vazquez-Reina

Vous avez probablement ajouté magit-blame-maybe-update-revision-bufferà magit-section-movement-hookpar erreur.
tarsius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.