Поєднання магіта з деревом для зручної навігації по історії


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 - це спрямований ациклічний графік . Це може бути нетривіально.
suvayu

2
Magit підтримує щось подібне, але в даний час я змінюю те, як увімкнено функцію. Я опублікую відповідь, коли закінчу з цим.
Тарсій

Відповіді:


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)

Зараз можливе автоматичне оновлення буфера blob аналогічним чином. Спочатку додайте це:

(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. Цей інший буфер не видаляється, що, на жаль, означає, що за короткий проміжок часу може накопичитися досить багато буферів. Який був би один із тих шорстких країв, я згадував раніше. Якщо натиснути qбуфер blob, це видалить його, тому ви можете очистити, перейшовши до вікна, яке використовувалося для відображення різних буферів blob, і продовжуйте натискати, qпоки всі буфери не будуть видалені.

Додатково можна перейти до наступного чи попереднього блоку з буфера blob за допомогою pта n. Я припускаю, що в більшості випадків ви починаєте з недавньої краплі, а потім переходите назад до старших крапель, використовуючи p. Якщо ви зробите це, а потім хочете рухатись в іншому напрямку, я рекомендую вам використовувати qдля вбивства поточного буфера і тим самим перейти до попереднього буфера, тобто до наступного блобу.

Також зауважте, що вам не потрібно спочатку відвідувати версію, щоб мати можливість відвідати крапку. Ви також можете використовувати 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помилково.
Тарсій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.