Làm cách nào để mở tệp từ một chi nhánh git khác?


35

Tôi muốn mở một tệp từ một nhánh khác trong kho git hiện tại. Tôi đã thấy câu hỏi SO này , nhưng các đề xuất kết hợp nó với Vim rất cồng kềnh (chuyển sang Vim, mở stdin, đặt filetype, v.v.) bằng tay). Có cách nào đơn giản hơn để giữ lại tô sáng cú pháp, cài đặt kiểu tệp, v.v. không?

Nếu nó giúp:

  • Tôi đã cài đặt plugin chạy trốn (mặc dù hiếm khi được sử dụng).
  • Tôi không cần phải sửa đổi nó.

Tệp có thể là tệp cho bộ đệm hiện đang mở hoặc một tệp khác.

Câu trả lời:


49

Bạn có thể sử dụng :Gedit/ :Gsplit/ :Gvsplit/ ... với mẫu{revision}:{filename}

:Gedit branch:/foo/bar.c

Lưu ý: Nếu tệp giống với tệp hiện tại, bạn có thể viết tắt lệnh như vậy : :Gsplit branch:%.

Nó thường là trường hợp khác biệt của tệp hiện tại được ưa thích hơn là chỉ mở tệp trên một nhánh khác. Bạn có thể làm điều này thông qua :Gdiff {branch}.

Để được trợ giúp thêm xem:

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

Bạn cũng có thể muốn xem các tập phim Vimcasts trong Fugitive Series .


Đẹp! Tò mò: điều gì xảy ra nếu tôi sửa đổi một tập tin đã mở như vậy?
muru

1
@muru Bạn sẽ nhận thấy rằng bộ đệm được mở ra trong bộ đệm chỉ đọc (có thể nhận thấy một [RO]dòng trong dòng trạng thái).
Peter Rincker

vâng, nó ở đó
muru

fugitivecần đường dẫn từ thư mục gốc của kho lưu trữ. Câu trả lời đã bao gồm điều này, nhưng tôi đã sai lầm khi cho rằng kẻ chạy trốn có thể hiểu khi chúng ta ở trong một thư mục con cụ thể của repo.
Paschalis

thật tuyệt vời .. lần đầu tiên sử dụng fugitive .. mặc dù tôi đã cài đặt nó trong một thời gian dài :)
alpha_989

14

Điều này rộng hơn một chút so với những gì OP yêu cầu, nhưng đối với những người không muốn sử dụng plugin và có thể các hệ thống kiểm soát sửa đổi khác, đoạn trích nhỏ này có xu hướng hoạt động khá tốt:

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

Nó tạo ra một cửa sổ mới và hiển thị tệp ở đó bằng cách đọc đầu ra của lệnh đã cho vào bộ đệm mới. Điều này tất nhiên hoạt động với bất kỳ lệnh bên ngoài, không chỉ git.

Ví dụ cho bzr (trong đó cú pháp REV có thể chỉ định một nhánh):

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

Ví dụ cho hg (không chắc chắn về các nhánh trong hg; không sử dụng đủ)

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

Ví dụ cho svn (

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

Bạn vẫn có thể muốn đặt kiểu tệp để làm nổi bật cú pháp như trong các bài viết SO, nhưng ít nhất bạn không phải gặp rắc rối với đường ống.

Sau khi mở, bạn có thể lưu nó dưới một tên mới bằng :w filenamehoặc :saveas filename, vì Vim sẽ không có tên tệp cho nó. Nếu bạn không muốn chỉnh sửa nó, bạn cũng có thể gửi một :setlocal readonlyvà / hoặc :setlocal nomodifiable.

-Chỉnh sửa: Filetype tự động-

Đó là một công việc nhiều hơn một chút, nhưng bạn có thể yêu cầu Vim đoán kiểu tệp với

:filetype detect

Nhưng, vì Vim chưa có tên, nên điều này không phải lúc nào cũng hoạt động tốt (ví dụ: tôi đã nhập một số mã C và nó đoán filtype=conf.

Chúng tôi có thể đặt tên cho nó bằng cách lưu nó, nhưng chúng tôi không muốn ghi đè lên một tệp có thể có. Chúng tôi cũng có thể chỉ đặt tên tệp (Cảm ơn @PeterRincker!), Nhưng một lần nữa, chúng tôi không muốn mạo hiểm va chạm. Vì không chắc là một tệp tồn tại cả tên nhánh và tên tệp cùng nhau, chúng tôi sẽ ghép chúng với một số dấu tách tùy ý

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

Nơi "file"được thay thế bằng tên tệp thực tế và "branch"với tên chi nhánh

Tất nhiên, tại thời điểm này, chúng tôi gần như đang viết một plugin ;-)

Kết hợp tất cả lại với nhau, ở đây nó là một hàm cụ thể git mà bạn có thể thả vào vimrc của mình:

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

mà bạn có thể gói trong một lệnh hoặc gọi trực tiếp, ví dụ call GitFile("whateverBranch","myfile.c"). Bạn sẽ nhận được một cửa sổ mới với một bộ đệm có tênwhateverBranch-myfile.c


Và tôi có thể lấy nó để tự động phát hiện kiểu, cú pháp, v.v. bằng phương pháp này không?
muru

Đáng buồn thay không phải không có thêm một số công việc; Tôi đã cập nhật bài đăng
John O'M.

1
Tôi khuyên bạn nên sử dụng phương pháp plugin từ bài đăng của @ PeterRinker nếu bạn có thể. Nó sẽ làm rất nhiều điều tốt đẹp mà bạn thích. Tôi chủ yếu muốn chứng minh rằng một người không cần phải rời khỏi trình soạn thảo cũng như không phải đối phó với những rắc rối của đường ống để lấy dữ liệu và tôi biết rằng có một số người ghét phải sử dụng plugin.
John O'M.

1
Tôi chỉ cần thêm một chút để có thể phát hiện filetype. Nó không còn là thứ bạn muốn chỉ cần gõ nhanh, nhưng có thể hoạt động như một bổ sung dễ dàng cho .vimrc. Sử dụng một plugin cụ thể có thể vẫn sẽ hoạt động tốt hơn.
John O'M.

Bạn có thể muốn xem xét việc sử dụng :fileđể đặt tên cho tệp của mình thay vì có một tệp tạm thời. Xem:h :file
Peter Rincker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.