Combinando magit com desfazer árvore para facilitar a navegação no histórico

16

Eu amo undo-tree(captura de tela abaixo). Ele fornece uma maneira fácil para navegar através de diferentes versões de um arquivo (janela superior), permitindo que o usuário move em torno da árvore história do arquivo em uma janela separada (janela inferior) com chaves simples, como n, pe C-be C-fpara alternar através descendentes da mesma pai.

Mais notavelmente, undo-treeatualiza o buffer que contém o arquivo com a versão correspondente com base na seleção na exibição em árvore, automaticamente.

Obviamente, magité fenomenal para o git, e seria incrível se tivesse uma capacidade semelhante, ou seja, permitir que os usuários navegassem de maneira interativa no histórico de git de um arquivo enquanto atualizavam simultaneamente o buffer que mantinha o arquivo automaticamente.

Isso é possível magithoje?

insira a descrição da imagem aqui

Amelio Vazquez-Reina
fonte
Não sei se é possível com o magit, mas dê uma olhada em github.com/pidu/git-timemachine
clemera 10/10/2015
Não tenho certeza, mas acho que undo-treeusa uma árvore (está no nome :-p), enquanto a história do Git é um gráfico acíclico direcionado . Pode não ser trivial.
suvayu
2
O Magit suporta algo assim, mas atualmente estou mudando a maneira como o recurso está ativado. Vou postar uma resposta quando terminar.
tarsius

Respostas:

7

Recentemente, o Magit ganhou suporte para algo assim, mas o recurso ainda é um pouco complicado e precisa ser ativado explicitamente.


Um recurso semelhante existe há muito tempo - quando você move de uma confirmação para outra em um buffer de log e outra janela no mesmo quadro é o buffer de revisão do repositório, esse buffer é atualizado para mostrar a confirmação em vez de qualquer confirmação. estava mostrando anteriormente.

Até muito recentemente, o buffer de revisão era criado quando você passou de um commit para outro. Eu mudei esse comportamento e agora o buffer de revisão é sempre atualizado . Se nenhuma janela no mesmo quadro já exibir esse buffer, a movimentação no log não fará mais com que o buffer seja exibido em alguma nova janela ou em uma janela existente que anteriormente exibia outro buffer.

Então agora você precisa pressionar SPCuma vez para exibir o buffer de revisão. Somente então ele começará a ser atualizado quando você mover o buffer de log.

Se você não deseja que o buffer de revisão seja atualizado, faça o seguinte:

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

Se, por outro lado, você também deseja que o buffer de revisão seja atualizado ao se mover no buffer de status, use o seguinte:

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

Agora é possível que um buffer de blob seja atualizado automaticamente de maneira semelhante. Primeiro adicione isto:

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

E talvez também:

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

Em seguida, dentro de um buffer de log (ou status), pressione RETpara exibir ou atualizar o buffer de revisão e também para alternar para esse buffer. Vá para o arquivo do seu interesse e pressione RETnovamente. Agora você está em um buffer de "visita a blob", que é semelhante a um buffer de visita a arquivos, exceto que ele não visita o arquivo na árvore de trabalho, mas o arquivo como estava em alguma confirmação.

Volte para o buffer de log (ou status) e vá para outra confirmação. O buffer de blob está sendo atualizado.


Observe que exibir outro blob na verdade não reutiliza o buffer de blob existente. Em vez disso, cria um novo buffer que visita esse blob e exibe esse buffer na janela que exibia anteriormente o outro buffer de blob. Esse outro buffer não está sendo excluído, o que infelizmente significa que muitos buffers podem se acumular em um curto período de tempo. Qual seria uma dessas arestas, como mencionei anteriormente. Pressionar qum buffer de blob o exclui, portanto, você pode limpar indo para a janela que foi usada para exibir os vários buffers de blob e continuar pressionando qaté que todos os buffers tenham sido excluídos.

Além disso, é possível navegar para o blob seguinte ou anterior a partir de um buffer de blob usando pe n. Presumo que, na maioria dos casos, você comece com um blob recente e depois volte para os blobs mais antigos usando p. Se você fizer isso e quiser seguir na outra direção, recomendo que você use qpara eliminar o buffer atual e, assim, passar para o buffer anterior, ou seja, o próximo blob.

Observe também que você não precisa primeiro visitar uma revisão para poder visitar um blob. Você também pode usar M-x magit-find-file RET <revision> RET <file> RETdiretamente, mas acho isso menos conveniente.

tarso
fonte
Obrigado tarsius. Estou trabalhando com o magit 20151014.231(o mais recente possível). Tentei seguir os passos que você descreveu acima. Fui para magit-log-buffer-fileo que me permite navegar pelos commits cima e para baixo com ne pmas quando eu pressionar SPCou RETem um deles eu recebo:Symbol's value as variable is void: magit-blame-mode
Amelio Vazquez-Reina
Você provavelmente adicionada magit-blame-maybe-update-revision-buffera magit-section-movement-hookpor engano.
tarsius