Bagaimana cara membuka file dari cabang git lain?

35

Saya ingin membuka file dari cabang lain di repositori git saat ini. Saya telah melihat pertanyaan SO ini , tetapi saran untuk menggabungkannya dengan Vim rumit (pipa ke Vim, buka stdin, atur filetype, dll secara manual). Apakah ada cara yang lebih sederhana yang mempertahankan penyorotan sintaks, pengaturan tipe file, dll.?

Jika itu membantu:

  • Saya telah menginstal plugin buron (meskipun jarang digunakan).
  • Saya tidak perlu memodifikasinya.

File dapat berupa file untuk buffer yang saat ini terbuka, atau yang berbeda.

muru
sumber

Jawaban:

49

Anda dapat menggunakan :Gedit/ :Gsplit/ :Gvsplit/ ... dengan formulir{revision}:{filename}

:Gedit branch:/foo/bar.c

Catatan: Jika file adalah sama dengan file saat ini Anda dapat menyingkat perintah seperti: :Gsplit branch:%.

Sering terjadi perbedaan file saat ini lebih disukai daripada hanya membuka file pada cabang yang berbeda. Anda dapat melakukannya melalui :Gdiff {branch}.

Untuk bantuan lebih lanjut lihat:

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

Anda mungkin juga ingin melihat episode Vimcasts di Fugitive Series .

Peter Rincker
sumber
Indah! Penasaran: apa yang terjadi jika saya memodifikasi file yang dibuka?
muru
1
@muru Anda akan melihat bahwa buffer dibuka di buffer hanya-baca (mungkin perhatikan sebuah [RO]di baris status).
Peter Rincker
ya, itu ada di sana.
muru
fugitivemembutuhkan path dari root repositori. Jawabannya sudah mencakup ini, tetapi saya salah berasumsi bahwa buron bisa mengerti ketika kita berada di subdirektori tertentu dari repo.
Paschalis
luar biasa .. pertama kali menggunakan pelarian .. meskipun saya sudah menginstalnya untuk waktu yang lama :)
alpha_989
14

Ini sedikit lebih luas daripada yang diminta OP, tetapi bagi orang yang tidak ingin menggunakan plugin, dan mungkin sistem kontrol revisi lainnya, potongan kecil ini cenderung bekerja dengan cukup baik:

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

Itu menciptakan jendela baru dan menunjukkan file di sana dengan membaca output dari perintah yang diberikan ke buffer baru. Ini tentu saja berfungsi dengan perintah eksternal apa pun, bukan hanya git.

Contoh untuk bzr (di mana sintaks REV dapat menentukan cabang):

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

Contoh untuk hg (tidak yakin tentang cabang di hg; jangan gunakan cukup)

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

Contoh untuk svn (

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

Anda mungkin masih ingin mengatur filetype untuk mendapatkan penyorotan sintaksis seperti pada posting SO, tetapi setidaknya Anda tidak perlu mengacaukan perpipaan.

Setelah dibuka, Anda dapat menyimpannya dengan nama baru dengan :w filenameatau :saveas filename, karena Vim belum memiliki nama file untuk itu. Jika Anda tidak ingin dapat mengeditnya, Anda juga dapat memasukkan a :setlocal readonlydan / atau :setlocal nomodifiable.

-Edit: Filetype Otomatis-

Ini sedikit lebih banyak pekerjaan, tetapi Anda dapat meminta Vim untuk menebak jenis file dengan

:filetype detect

Tapi, karena Vim belum memiliki nama, ini tidak selalu bekerja dengan baik (misalnya, saya menarik beberapa kode C dan tebakannya filtype=conf.

Kami dapat memberikan nama dengan menyimpannya, tetapi kami tidak ingin menimpa file yang mungkin ada. Kami juga dapat mengatur nama file (Terima kasih @PeterRincker!), Tetapi sekali lagi, kami tidak ingin mengambil risiko tabrakan. Karena tidak mungkin ada file yang merupakan nama cabang dan nama file bersamaan, kami akan menggabungkannya dengan beberapa pemisah yang arbitrer

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

Di mana "file"diganti dengan nama file aktual dan "branch"dengan nama cabang

Tentu saja, pada titik ini kita hampir menulis sebuah plugin ;-)

Dengan menggabungkan semuanya, ini dia sebagai fungsi spesifik git yang bisa Anda jatuhkan di vimrc Anda:

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

yang dapat Anda bungkus dalam perintah atau panggilan langsung misalnya call GitFile("whateverBranch","myfile.c"). Anda akan mendapatkan jendela baru dengan nama penyanggawhateverBranch-myfile.c

John O'M.
sumber
Dan bisakah saya mendapatkannya untuk mendeteksi tipe file, sintaksis, dll secara otomatis dengan metode ini?
muru
Sayangnya bukan tanpa kerja lagi; Saya memperbarui pos
John O'M.
1
Saya merekomendasikan menggunakan metode plugin dari posting @ PeterRinker jika Anda bisa. Itu harus melakukan banyak hal baik yang Anda inginkan. Saya kebanyakan ingin menunjukkan bahwa seseorang tidak perlu meninggalkan editor atau berurusan dengan kerepotan perpipaan untuk mendapatkan data, dan saya tahu bahwa ada beberapa orang yang benci harus menggunakan plugin.
John O'M.
1
Saya baru saja menambahkan sedikit untuk dapat mendeteksi tipe file. Ini bukan lagi sesuatu yang Anda ingin cukup ketik sambil jalan, tetapi bisa berfungsi sebagai tambahan yang mudah untuk .vimrc. Menggunakan plugin tertentu mungkin masih akan bekerja lebih baik.
John O'M.
Anda mungkin ingin melihat menggunakan :filenama file Anda daripada memiliki file sementara. Lihat:h :file
Peter Rincker