Có cách nào để móc tiết kiệm trong Vim lên để cam kết trong git không?


11

Tôi chưa quen với thế giới của Vim và tôi muốn làm cho nó để mỗi lần tôi lưu một tệp, nó được cam kết kiểm soát phiên bản. Điều này có thể không?

Câu trả lời:


4

Bạn có thể sử dụng autocommands của Vim:

:autocmd BufWritePost * execute '!git add % && git commit -m %'

Điều đó chưa được kiểm tra nhưng cần thêm tệp và cam kết với tên tệp là thông điệp cam kết.
Bạn muốn BufWritePost vì điều này được kích hoạt sau khi tệp được viết. Tôi tưởng tượng có rất nhiều trường hợp cạnh khó chịu hoặc không an toàn.


4

Tôi sử dụng một autocommand vim mà tôi đặt trong .vimrc của tôi. Lệnh trước tiên thực hiện kiểm tra thô rằng chúng tôi đang làm việc trong thư mục git (bằng cách kiểm tra sự tồn tại của thư mục .git, trong thư mục hiện tại hoặc sử dụng git rev-parse), sau đó sử dụng git -a -m %sao cho chỉ các tệp đã được thêm trước đó được dàn dựng và cam kết .

autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'

1
Không có trích dẫn duy nhất ở cuối cmd, ngay sau fi.
Andrew-Dufresne

2
Phiên bản này chỉ hoạt động nếu bạn đang ở trong thư mục gốc của repo của bạn. Một giải pháp tốt hơn là autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi', từ câu trả lời SO
Andrew-Dufresne

Điều này làm việc cho tôi trên linux. Bất kỳ ý tưởng làm thế nào để làm cho nó hoạt động trên windows?
dùng334287

2

Bạn có thể muốn xem xét các plugin chạy trốn , đó là một plugin git rất mạnh cho vim. Bạn cũng có thể thiết lập một autocmdnhư donothingsuccessfullygợi ý, nhưng có nó bật lên :Gcommithay :Gstatus(mà từ đó bạn có thể chọn cherry thay đổi để thêm vào chỉ số git)


1

Dựa trên các câu trả lời mà người khác đã cung cấp:

autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'

Điều này là hoàn toàn minh bạch. Bạn sẽ không nhận được thông báo "Nhấn enter để tiếp tục" (nhưng nếu cam kết không hoạt động, bạn sẽ không biết nó thất bại).


0

Bạn chắc chắn có thể làm trắng macro này hoặc với ánh xạ lại lệnh.

(Kiểm tra /programming/117150/can-i-re-map-commands-in-vim )

Tôi không chắc đó là một lựa chọn tốt. Bây giờ tôi không thành thạo git và tôi biết đôi khi nó khác với svn. Nhưng tôi sẽ không thực hiện tự động cam kết này với svn. Cam kết cần phải có ý nghĩa và không tiết kiệm một số thời gian thường xuyên.

Bạn thường cam kết vì bạn đã thêm một chức năng, sửa lỗi, ... không chỉ vì bạn đã làm việc trên một tệp. Bạn sẽ không kết thúc với dự án không biên dịch hoặc hàm chưa hoàn thành.


Điều đó đúng, nhưng tôi cũng muốn có một kịch bản qua đêm để di chuyển các tệp được biên dịch thành công từ repo "save-on-commit" sang repo "thay đổi có ý nghĩa".
gonzo.floyd

Chà, đó không hoàn toàn là một ý tưởng tồi với Git. "Cam kết thường xuyên" là một phương châm. Nó cũng hoạt động tốt hơn theo cách này, bởi vì bạn có thể làm việc đồng thời trên cùng một tệp với nhiều nhà phát triển và các vấn đề tối thiểu. Sẽ rất hữu ích khi kết nối với cơ chế lưu của vim.
Nhà siêu âm

Quy trình làm việc trong Git có thể hoàn toàn khác với Subversion. Bạn có thể không bao giờ làm điều này trong svn vì nó sẽ bị lạm dụng, nhưng nó có cách sử dụng hoàn toàn hợp lệ trong git. Ví dụ, một máy chủ tích hợp thử nghiệm nào đó có thể được nối với một nhánh thử nghiệm. Tự động cam kết lưu sau đó trở nên khá hữu ích. Khi bạn đến điểm một cái gì đó đang hoạt động, sau đó bạn sẽ sử dụng git rebase để nén tất cả các hoạt động thành một cam kết duy nhất với một thông điệp có ý nghĩa, sau đó hợp nhất vào nhánh phát triển của bạn. Nếu điều này nghe có vẻ đáng sợ hoặc phức tạp thì đó chỉ là do bạn thích nghi với các giới hạn của vcs nguồn không phân phối.
Caleb

0

Tôi biết câu hỏi này đã cũ và đây là tự quảng cáo trắng trợn, nhưng tôi đã viết một plugin Vim sẽ kích hoạt một số tập lệnh shell nhất định để chạy sau các autocmdsự kiện Vim cụ thể . Ví dụ, một tập lệnh có tên .bufwritepost.vimhook.shsẽ được chạy (đồng bộ) mỗi khi BufWritePostlệnh được kích hoạt. Sau đó, bạn có thể dễ dàng bao gồm bất kỳ logic nào bạn muốn để thực hiện cam kết git bên trong tập lệnh đó. Plugin giả định các quy ước đặt tên cụ thể của các tập lệnh này và cũng hỗ trợ các tập lệnh "hook" chỉ kích hoạt các tệp khớp với các tên nhất định hoặc có các phần mở rộng nhất định.

Chi tiết đầy đủ: https://github.com/ahw/vim-hooks


0

Tôi muốn báo cáo về vấn đề này.

Tôi có vimrc.vimmột kho lưu trữ git ( $VIMCONF, với bootstrap .vimrc) và ánh xạ <Leader>ve("chỉnh sửa vim") để mở vimrc trong một tab mới. Điều này không ảnh hưởng đến thư mục làm việc hiện tại.

Vì vậy, nếu tôi chỉnh sửa vimrc.vimtừ một vim bắt đầu trong một thư mục khác bên ngoài kho lưu trữ vim git của tôi, cách tiếp cận được thảo luận bởi Nick Edwards sẽ thất bại. Hack của tôi là như sau (cho windows và linux)

if has('win32')
    " The git command has to be passed to git. So we need to call bash.exe.
    autocmd BufEnter *vimrc.vim silent! lcd %:p:h
    autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
    autocmd BufWritePost *vimrc.vim
        \ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
        \ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) | 
        \ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
        \ execute 'cd' fnameescape(tempdir) |
        \ endif
endif

Giải trình:

  1. Đối với windows, tôi thay đổi thư mục thành vị trí tệp vimrc. Đây không phải là tốt nhất và tôi có thể thay đổi tương tự như linux. Đừng quá nghiêm trọng nhưng bạn có thể muốn sử dụng nó như một hướng dẫn. gitđã được trong đường dẫn (tức là bạn sẽ có thể gõ git <ENTER>vào cmd.exe)
  2. Đối với Linux, trước tiên tôi kiểm tra xem tôi có đang chỉnh sửa đúng vimrc.vim không
  3. Lưu thư mục làm việc hiện tại vào tempdir
  4. Thay đổi thư mục thành tệp vimrc.vim
  5. Làm git cam kết
  6. Quay trở lại thư mục làm việc trước đó
  7. Tôi tự đẩy các thay đổi git

Ghi chú:

  1. Các lệnh có thể được "xâu chuỗi" trong vim với |. Chuỗi sẽ hủy bỏ nếu bất kỳ lệnh nào thất bại. Để vượt qua một số dòng bắt đầu dòng tiếp theo với \.
  2. Điều này có thể được mở rộng đến các tập tin ftplugin. Bộ lọc của bạn sẽ *.vimexpand($VIMCONF)."/ftplugin/"
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.