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


11

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

回答:


4

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

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

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


4

.vimrcに配置するvim自動コマンドを使用します。このコマンドは、最初にgitディレクトリで作業していることを大まかにチェックし(現在のディレクトリまたはを使用して.gitディレクトリの存在を確認するgit rev-parse)、次にを使用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'

1
コマンドの最後のfiの直後に単一引用符がありません。
Andrew-Dufresne 2012

2
このバージョンは、リポジトリのルートディレクトリにいる場合にのみ機能します。より良い解決策はautocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'SOの回答
Andrew-Dufresne

これはLinuxで動作します。どのようにそれをWindowsで機能させるか考えていますか?
user334287 2018

2

あなたは逃亡者のプラグインを調べたいかもしれません、それはvimのための非常に強力なgitプラグインです。提案autocmdどおりに設定することもできますが、donothingsuccessfullyポップアップ:Gcommitまたは:Gstatus(gitインデックスに追加する変更をチェリーピックできます)


1

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

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キーを押して続行」というメッセージは表示されません(ただし、コミットが機能しなかった場合、コミットが失敗したことはわかりません)。


0

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

/programming/117150/can-i-re-map-commands-in-vimを確認してください

それが良いオプションかどうかはわかりませんが。私は今のところgitに慣れていないので、svnとは時々違うことを知っています。しかし、私はこの自動コミットをsvnで実行しません。コミットは意味のあるものである必要があり、定期的に保存する必要はありません。

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


それは事実ですが、コンパイルが成功したファイルを「保存時のコミット」リポジトリから「意味のある変更」リポジトリに移動する夜間スクリプトも必要です。
gonzo.floyd

まあ、それはGitで完全に悪い考えではありません。「頻繁にコミットする」はモットーのようなものです。同じ方法で複数の開発者と最小限の問題で同じファイルを同時に作業できるため、この方法でもうまく機能します。vimの保存メカニズムにフックすると非常に便利です。
メタグラファー、2011

GitのワークフローはSubversionと根本的に異なる場合があります。悪用されるため、svnでこれを行うことは決してないかもしれませんが、gitでは完全に有効な用途があります。たとえば、ある種のテスト統合サーバーをテストブランチにフックすることができます。保存時の自動コミットは非常に役立ちます。何かが機能するようになったら、git rebaseを使用して、すべてのアクティビティを意味のあるメッセージを含む単一のコミットに押しつぶし、develブランチにマージします。これが恐ろしい、または複雑に聞こえる場合は、非分散型ソースVCの制限に適応しているためです。
カレブ2014

0

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

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


0

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

私はvimrc.vimgitリポジトリ($VIMCONF、ブートストラップ.vimrcを含む)にあり<Leader>ve、新しいタブでvimrcを開くようにマップ( "vim edit")しています。これは現在の作業ディレクトリには影響しません。

そのvimrc.vimため、vim gitリポジトリの外部の別のディレクトリで開始したvimから編集すると、Nick Edwardsによって議論されたアプローチは失敗します。私のハックは次のとおりです(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. git commitしてください
  6. 前の作業ディレクトリに戻る
  7. 私はGitの変更を手動でプッシュします

ノート:

  1. コマンドはvimでと「連鎖」させることができます|。いずれかのコマンドが失敗すると、チェーンは中止されます。複数の行を分割するには、次の行をで始め\ます。
  2. これは、ftpluginファイルに拡張できます。あなたのフィルタは次のようになります*.vimし、expand($VIMCONF)."/ftplugin/"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.