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
cmd 끝에서 fi 바로 뒤에 작은 따옴표가 없습니다.
Andrew-Dufresne

2
이 버전은 repo의 루트 디렉토리에있는 경우에만 작동합니다. 더 나은 솔루션은 autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'A로부터, SO 답변
앤드류 - 듀프 레인

이것은 리눅스에서 저에게 효과적입니다. Windows에서 작동시키는 방법을 알고 있습니까?
user334287

2

도망자 플러그인 을 살펴볼 수도 있습니다 . vim을위한 매우 강력한 자식 플러그인입니다. 제안한 autocmd대로 설정을 할 수도 donothingsuccessfully있지만 팝업을 표시 :Gcommit하거나 :Gstatusgit 인덱스에 추가 할 변경 사항을 선택할 수 있습니다.


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 확인 )

그래도 좋은 옵션인지 잘 모르겠습니다. 나는 현재 자식에 능숙하지 않으며 때로는 svn과 다르다는 것을 알고 있습니다. 그러나 나는 svn 으로이 자동 커밋을하지 않을 것입니다. 커밋은 의미가 있어야하며 정기적으로 시간을 절약 할 수는 없습니다.

파일을 작업 한 것이 아니라 함수를 추가하고 버그를 수정했기 때문에 일반적으로 커밋합니다. 컴파일되지 않은 프로젝트 또는 완료되지 않은 기능으로 끝나지 않습니다.


사실이지만, "commit-on-commit"저장소에서 "의미있는 변경"저장소로 성공적으로 컴파일 된 파일을 이동시키는 야간 스크립트를 갖고 싶습니다.
gonzo.floyd

글쎄, 그것은 Git에게 완전히 나쁜 생각은 아닙니다. "자주 커밋"은 일종의 모토입니다. 여러 개발자와 최소한의 문제로 동일한 파일에서 동시에 작업 할 수 있기 때문에이 방법으로도 더 잘 작동합니다. vim의 저장 메커니즘에 연결하는 것이 매우 유용합니다.
Metagrapher

Git의 워크 플로우는 Subversion과 근본적으로 다를 수 있습니다. svn에서는 결코 모욕적이기 때문에이 작업을 수행하지 않을 수도 있지만 git에서는 완벽하게 유효합니다. 예를 들어 어떤 종류의 테스트 통합 서버를 테스트 브랜치에 연결할 수 있습니다. 저장시 자동 커밋은 매우 유용합니다. 무언가가 작동하는 시점에 도달하면 git rebase를 사용하여 모든 활동을 의미있는 메시지와 함께 단일 커밋으로 스쿼시 한 ​​다음 devel 브랜치로 병합합니다. 이것이 무섭거나 복잡하게 들린다면 이는 비 분산 소스 vc의 한계에 적응했기 때문입니다.
Caleb

0

나는이 질문이 오래되었다는 것을 알고 있으며 이것이 명백한 자체 판촉이지만 특정 Vim autocmd이벤트 후에 특정 쉘 스크립트가 실행되도록 Vim 플러그인을 작성 했습니다. 예를 들어, 이름 .bufwritepost.vimhook.sh이 지정된 스크립트 는 BufWritePost명령이 실행될 때마다 (동기식으로) 실행 됩니다. 그런 다음 해당 스크립트 내에서 git commit을 수행하기 위해 원하는 로직을 쉽게 포함시킬 수 있습니다. 플러그인은 이러한 스크립트의 특정 명명 규칙을 가정하고 특정 이름과 일치하거나 특정 확장자를 가진 파일에서만 트리거하는 "후크"스크립트를 지원합니다.

자세한 내용 : https://github.com/ahw/vim-hooks


0

이 문제에 대한 의견을보고 싶습니다.

나는이 vimrc.vim(자식 저장소에 $VIMCONF부트 스트랩의 .vimrc로) 및 매핑 <Leader>ve새 탭에서의 vimrc를 엽니 다 ( "정력 편집"). 이것은 현재 작업 디렉토리에 영향을 미치지 않습니다.

따라서 vimrc.vimvim 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. 자식 커밋을 수행
  6. 이전 작업 디렉토리로 돌아 가기
  7. 수동으로 자식 변경 사항을 푸시합니다

노트:

  1. 명령을 사용하여 vim에서 "체인"할 수 있습니다 |. 명령 중 하나라도 실패하면 체인이 중단됩니다. 여러 줄을 나누려면로 다음 줄을 시작하십시오 \.
  2. 이것은 ftplugin 파일로 확장 될 수 있습니다. 귀하의 필터가 될 것입니다 *.vimexpand($VIMCONF)."/ftplugin/"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.