Сочетание magit и undo-tree для удобной навигации по истории


16

Я люблю undo-tree(скриншот ниже). Это обеспечивает простой способ для навигации по различным версиям файла (верхнее окно), позволяя пользователю двигаться вокруг дерева истории файла в отдельном окне (нижнее окно) с простыми клавишами , такими как n, pи C-bи C-fпереключателю через потомков одного и того же родитель.

В частности undo-tree, автоматически обновляется буфер, содержащий файл, с соответствующей версией, основанной на выборе в древовидном представлении.

Конечно, magitэто феноменально для git, и было бы удивительно, если бы у него была похожая возможность, то есть позволяла пользователям интерактивно перемещаться по истории git файла, одновременно обновляя буфер, содержащий файл автоматически.

Это вообще возможно с magitсегодняшним днем?

введите описание изображения здесь


Не знаю, возможно ли это с помощью magit, но посмотрите на github.com/pidu/git-timemachine
clemera

Я не уверен, но я думаю, что undo-treeиспользует дерево (оно в названии :-p), тогда как история Git представляет собой ориентированный ациклический граф . Это может быть нетривиально.
Суваю

2
Magit действительно поддерживает что-то вроде этого, но в настоящее время я меняю способ включения этой функции. Я отправлю ответ, когда закончу с этим.
Tarsius

Ответы:


7

Недавно Magit получил поддержку для чего-то подобного, но эта функция все еще немного грубовата и должна быть включена явно.


Подобная функция существует в течение длительного времени - когда вы переходите от одного коммита к другому в буфере журнала, а другое окно в том же фрейме является буфером ревизии хранилища, тогда этот буфер обновляется, чтобы показать этот коммит вместо того, чтобы фиксировать его ранее показывал.

До недавнего времени буфер ревизий создавался при первом переходе от одного коммита к другому. Я изменил это поведение, и теперь буфер ревизий обновляется только когда-либо . Если ни одно окно в том же кадре уже не отображает этот буфер, перемещение по журналу больше не приведет к отображению буфера в каком-либо новом окне или существующем окне, в котором ранее отображался какой-либо другой буфер.

Так что теперь вы должны нажать SPCодин раз, чтобы отобразить буфер ревизий. Только тогда он начнет обновляться, когда вы перемещаетесь по буферу журналов.

Если вы не хотите обновлять буфер ревизий, сделайте следующее:

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

Если, с другой стороны, вы также хотите обновить буфер ревизий при перемещении в буфере состояния, используйте это:

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

Теперь возможно, чтобы буфер больших двоичных объектов автоматически обновлялся аналогичным образом. Сначала добавьте это:

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

И, возможно, также:

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

Затем в буфере журнала (или состояния) нажмите, RETчтобы отобразить или обновить буфер ревизий, а также переключиться на этот буфер. Перейдите к нужному файлу и RETснова нажмите . Теперь вы находитесь в буфере «посещения блобов», который похож на буфер посещения файлов, за исключением того, что он не посещает файл в рабочем дереве, а файл, как это было в некотором коммите.

Вернитесь в буфер журнала (или состояния) и перейдите к другому коммиту. Буфер BLOB-объектов обновляется.


Обратите внимание, что отображение другого большого двоичного объекта фактически не использует существующий буфер большого двоичного объекта. Вместо этого он создает новый буфер, который посещает этот BLOB-объект, а затем отображает этот буфер в окне, в котором ранее отображался другой буфер BLOB-объектов. Этот другой буфер не удаляется, что, к сожалению, означает, что за короткий промежуток времени может накопиться довольно много буферов. Который был бы одним из тех грубых краев, я упоминал ранее. Нажатие qв буфере BLOB-объектов действительно удаляет его, поэтому вы можете очистить его, перейдя в окно, которое использовалось для отображения различных буферов BLOB-объектов, и продолжайте нажимать, qпока все буферы не будут удалены.

Кроме того, можно перейти к следующему или предыдущему большому объекту из буфера большого объекта, используя pи n. Я полагаю , что в большинстве случаев вы начинаете с недавним сгустком , а затем перейти назад к старым сгусткам с помощью p. Если вы делаете это и затем хотите двигаться в другом направлении, я рекомендую вам использовать, qчтобы уничтожить текущий буфер и, таким образом, перейти к предыдущему буферу, то есть к следующему большому объекту.

Также обратите внимание, что вам не нужно сначала посещать ревизию, чтобы иметь возможность посетить BLOB-объект. Вы также можете использовать M-x magit-find-file RET <revision> RET <file> RETнапрямую, но я считаю, что это менее удобно.


Спасибо Тарсиус. Я работаю с magit 20151014.231(последний, насколько я могу судить). Я попытался выполнить шаги, которые вы описали выше. Я пошел , magit-log-buffer-fileчто позволяет мне проводить совершающий вверх и вниз nи , pно когда я нажимаю SPCили RETна одной из них я получаю:Symbol's value as variable is void: magit-blame-mode
Амелио Васкес-Рейн

Вы , наверное , добавили magit-blame-maybe-update-revision-bufferк magit-section-movement-hookпо ошибке.
Tarsius
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.