Як відкрити файл з іншої гілки git?


35

Я хотів би відкрити файл з іншої гілки в поточному сховищі git. Я бачив це питання ТА , але пропозиції щодо його поєднання з Vim є громіздкими (передача в Vim, відкриття stdin, встановлення файлів тощо вручну). Чи є більш простий спосіб, який зберігає підсвічування синтаксису, налаштування файлів тощо?

Якщо це допомагає:

  • У мене встановлений плагін- втікач (хоча рідко використовується).
  • Мені це не потрібно змінювати.

Файл може бути файлом для відкритого в даний час буфера, або іншим.

Відповіді:


49

Ви можете використовувати :Gedit// :Gsplit/ :Gvsplit/ ... з формою{revision}:{filename}

:Gedit branch:/foo/bar.c

Примітка: Якщо файл є тим же, що і поточний файл , ви можете скоротити команду в такий спосіб: :Gsplit branch:%.

Часто буває так, що віддається перевага поточного файлу, ніж просто відкриття файлу на іншій гілці. Це можна зробити через :Gdiff {branch}.

Докладнішу інформацію див.

:h fugitive-:Gedit
:h fugitive-revision
:h fugitive-:Gdiff
:h c_%

Ви також можете перевірити епізоди Vimcasts в серії "Втікачі" .


Гарний! Цікаво: що трапиться, якщо я зміню файл, що відкрився?
муру

1
@muru Ви помітите, що буфер відкривається в буфері лише для читання (можливо, це помічено [RO]в рядку стану).
Пітер Рінкер

так, це там.
муру

fugitiveпотрібен шлях від кореня сховища. Відповідь вже охоплює це, але я помилково припускав, що втікач може зрозуміти, коли ми знаходимось у певному підкаталозі репо.
Пашаліс

дивовижно .. вперше з використанням втікача .. хоча я його встановив давно :)
alpha_989

14

Це дещо ширше, ніж те, що запитувала ОП, але для людей, які не бажають використовувати плагіни та, можливо, інші системи контролю ревізії, цей маленький фрагмент працює досить добре:

:new
:r! git show branch:file
:1d

Він створює нове вікно і показує файл там, читаючи вихід даної команди в новий буфер. Це, звичайно, працює з будь-якою зовнішньою командою, а не лише з git.

Приклад для bzr (де синтаксис REV може вказати гілку):

:new
:r! bzr cat -r REV file
:1d

Приклад hg (не впевнений у гілках hg; не використовуйте його достатньо)

:new
:r! hg cat -r REV file
:1d

Приклад для svn (

:new
:r! svn cat file@REV
:1d

Ви, ймовірно, хочете встановити тип файлу для виділення синтаксису, як у публікаціях SO, але принаймні вам не доведеться возитися з трубопроводом.

Після відкриття ви можете зберегти його під новим іменем :w filenameабо :saveas filename, оскільки Vim ще не буде мати ім’я файлу. Якщо ви не хочете мати можливість редагувати його, ви також можете вписати а :setlocal readonlyта / або :setlocal nomodifiable.

-Edit: автоматичний тип файлу-

Це трохи більше роботи, але ви можете попросити Віма здогадатися про тип файлу

:filetype detect

Але оскільки у Vim ще немає імені, це не завжди працює добре (наприклад, я вписав якийсь код C, і він здогадався filtype=conf.

Ми можемо дати йому ім’я, зберігаючи його, але ми не хочемо перезаписувати можливий існуючий файл. Ми також можемо просто встановити ім’я файлу (спасибі @PeterRincker!), Але знову ж таки, ми не хочемо ризикувати зіткненнями. Оскільки навряд чи існує файл, який є і ім'ям гілки, і ім'ям файлу разом, ми з'єднаємо їх з деяким довільним роздільником

:exe "silent file " . "branch" . "-" . "file"
:filetype detect

Де "file"замінено фактичним іменем файлу та "branch"назвою гілки

Звичайно, в цей момент ми майже пишемо плагін ;-)

Розташовуючи все це разом, ось ця функція, як специфічна git, ви можете скинути свій vimrc:

function! GitFile(branch,file)
    new
    exe "silent r! git show " . a:branch . ":" . a:file
    1d
    exe "silent file " . a:branch . "-" . a:file
    filetype detect
    setlocal readonly     "don't allow saving
    setlocal nomodified   "allow easy quitting without saving
    setlocal nomodifiable "don't allow modification
endfunction

яку ви могли б запустити в команду або безпосередньо зателефонувати, наприклад call GitFile("whateverBranch","myfile.c"). Ви отримаєте нове вікно з буфером з ім'ямwhateverBranch-myfile.c


І чи можу я за допомогою цього методу автоматично виявити тип файлу, синтаксис тощо?
муру

На жаль не обійшлося без ще однієї роботи; Я оновив пост
Джон О'М.

1
Я радимо скористатися методом плагіна з поста @ PeterRinker, якщо можете. Це повинно зробити багато приємних речей, які ви хотіли б. Я в основному хотів показати, що для отримання даних не потрібно залишати редактора, а також не стикатися з клопотами трубопроводів, і я знаю, що є люди, які ненавидять використовувати плагіни.
Джон О'М.

1
Я лише додав трохи, щоб можна було виявити тип файлу. Це вже не те, що ви хочете просто вводити на льоту, але може працювати як легке доповнення до .vimrc. Використання певного плагіна все одно, ймовірно, буде працювати краще.
Джон О'М.

Ви можете розглянути :fileможливість іменування свого файлу, а не тимчасового файлу. Дивіться:h :file
Пітер Рінкер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.