web-dev-qa-db-ja.com

Vimでの保存をgitでコミットするまでフックする方法はありますか?

私はVimの世界に不慣れで、ファイルを保存するたびにバージョン管理にコミットされるようにしたいと思っています。これは可能ですか?

11
gonzo.floyd

.vimrcに配置したvim自動コマンドを使用します。このコマンドは、最初にgitディレクトリで作業していることを大まかにチェックし(現在のディレクトリまたはgit rev-parseを使用して.gitディレクトリの存在をチェックします)、次にgit -a -m %を使用して以前に追加されたファイルはステージングされ、コミットされます。

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

Vimの自動コマンドを使用できます:

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

これはテストされていませんが、ファイルを追加し、ファイル名をコミットメッセージとしてコミットする必要があります。
ファイルが書き込まれた後にトリガーされるため、BufWritePostが必要です。しかし、厄介な、または安全でないEdgeのケースがたくさんあると思います。

fugitive プラグインを調べてみてください。これは、vim用の非常に強力なgitプラグインです。 autocmdが示唆するようにdonothingsuccessfullyを設定することもできますが、それをポップアップさせる:Gcommitまたは:Gstatus(変更をチェリーピックしてgitインデックスに追加できます)

2
mkomitee

他の人が提供した答えに基づいて:

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'

これは完全に透過的です。 「Enterキーを押して続行してください」というメッセージは表示されません(ただし、コミットが機能しなかった場合は、失敗したことがわかりません)。

1
sargon

あなたは確かにこれをマクロまたはコマンドの再マッピングで行うことができます。

(チェック https://stackoverflow.com/questions/117150/can-i-re-map-commands-in-vim

しかし、それが良い選択肢かどうかはわかりません。私は今のところgitに堪能ではなく、svnとは異なる場合があることを知っています。しかし、私はsvnでこの自動コミットを行いません。コミットは意味のあるものである必要があり、定期的に保存する必要はありません。

通常、関数を追加したり、バグを修正したりしたためにコミットします...ファイルで作業したためだけではありません。コンパイルされていないプロジェクトや未完成の関数になってしまうことはありません。

0
M'vy

私はこの質問が古く、これが露骨な自己宣伝であることを知っていますが、特定のVim autocmdイベントの後に特定のシェルスクリプトが実行されるようにトリガーするVimプラグインを作成しました。たとえば、.bufwritepost.vimhook.shという名前のスクリプトは、BufWritePostコマンドが実行されるたびに(同期的に)実行されます。次に、そのスクリプト内にgitcommitを実行するために必要なロジックを簡単に含めることができます。プラグインは、これらのスクリプトの特定の命名規則を前提としており、特定の名前に一致するファイルまたは特定の拡張子を持つファイルでのみトリガーされる「フック」スクリプトもサポートしています。

詳細: https://github.com/ahw/vim-hooks

0
Andrew

この問題についての私の見解を報告したいと思います。

Gitリポジトリ(_vimrc.vim_、bootstrap .vimrc)に_$VIMCONF_があり、_<Leader>ve_( "vim edit")をマップして開く)新しいタブのvimrc。これは現在の作業ディレクトリには影響しません。

したがって、vim gitリポジトリの外部の別のディレクトリで開始されたvimから_vimrc.vim_を編集すると、NickEdwardsによって議論されたアプローチは失敗します。私のハックは次のとおりです(Windowsと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
_

説明:

  1. Windowsの場合、ディレクトリをvimrcファイルの場所に変更します。これは最善ではありません。後でLinuxに似たものに変更する可能性があります。これをあまり真剣に受け止めないでください。ただし、ガイドとして使用することをお勧めします。 gitはパスに含まれている必要があります(つまり、_git <ENTER>_に_cmd.exe_と入力できる必要があります)
  2. Linuxの場合、最初に正しいvimrc.vimを編集していることを確認します
  3. 現在の作業ディレクトリをtempdirに保存します
  4. ディレクトリをvimrc.vimファイルに変更します
  5. Gitcommitを実行します
  6. 前の作業ディレクトリに戻る
  7. 手動でgitの変更をプッシュします

ノート:

  1. コマンドは、vimで_|_を使用して「チェーン」できます。コマンドのいずれかが失敗すると、チェーンは中止されます。複数の行を分割するには、次の行を_\_で開始します。
  2. これはftpluginファイルに拡張できます。フィルタは_*.vim_およびexpand($VIMCONF)."/ftplugin/"になります
0
user334287