자식 자동 커밋 만들기


155

git을 사용하여 모든 변경 사항을 파일에 기록하고 싶습니다.

파일을 업데이트 할 때마다 git 'commit'을 자동으로 설정하는 방법이 있습니까? 따라서 파일을 변경할 때마다 새로운 커밋이 있습니까?

이상적으로는 사용자가 자식이이면에서 실행되고 있음을 알지 못하도록하고 싶습니다. 그런 다음 사용자는 파일에 대한 변경 사항을 "실행 취소"할 수 있으며 이는 이전 버전을 git에서 가져 와서 달성 할 수 있습니다.


9
버전 관리 파일 시스템을 사용하는 것이 더 쉬울 것입니다 : en.wikipedia.org/wiki/Versioning_file_system
William Pursell

1
SparkleShare는 상당히 인상적이었습니다.
theode

SparkleShare은 선택을 보이지만 메인 자식 내부에 .git 폴더 파괴
insign

github.com/jw0k/gwatch 를 사용할 수 있습니다 . Windows 및 Linux에서 작동합니다.
rubix_addict 12

@rubix_addict 왜 답변으로 게시하지 않았습니까?
Tobias Kienzler

답변:


127

Linux 에서는 파일 내용이 변경 될 때마다 inotifywait 를 사용 하여 자동으로 명령을 실행할 수 있습니다 .

편집 : 다음 명령은 file.txt가 저장 되 자마자 커밋합니다.

inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh

2
단일 파일이 아닌 전체 폴더에 대해 어떻게이 작업을 수행 할 수 있습니까?
Anderson Green

2
-r플래그를 사용 inotifywait하되, 커널은 설정할 수있는 inotifywait 워치 수에 제한이 있습니다. man inotifywait당신에게 더 말할 것입니다.
JesperE

14
창문에 어떤 옵션이 있습니까?
Chandan Pasunoori

50

이전의 inotifywait 답변은 훌륭하지만 완벽한 솔루션은 아닙니다. 작성된 것처럼 파일에서 한 번만 변경하면 한 번만 커밋됩니다. 파일을 편집하면 원래 이름으로 새 inode가 생성되는 일반적인 경우에는 작동하지 않습니다. inotifywait -m 은 이름이 아닌 inode에 의해 파일을 따르는 것 같습니다. 또한 파일이 변경된 후에는 git add 또는 git commit -a 없이 git commit 을 위해 준비되지 않습니다 . 일부 조정을 수행하면 데비안에서 캘린더 파일의 모든 변경 사항을 추적하는 데 사용합니다.

/etc/rc.local :


su -c /home/<username>/bin/gitwait -l <username>

/ home / <사용자 이름> / bin / gitwait :


#!/bin/bash
#
# gitwait - watch file and git commit all changes as they happen
#

while true; do

  inotifywait -qq -e CLOSE_WRITE ~/.calendar/calendar

  cd ~/.calendar; git commit -a -m 'autocommit on change'

done

이것은 파일 및 / 또는 디렉토리 목록 및 해당 inotifywait 프로세스 를 대기 하고 파일이 변경 될 때 각 inotifywait 를 다시 시작 하도록 일반화 될 수 있습니다 .


8
레스터 당신은 이것을 디렉토리로 일반화하는 방법을 확장 할 수 있습니까?
Diego

29

이 작업에 대해 inotifywait 를 권장하는 이전 답변 은이 문제가 발생했을 때 올바른 방향으로 나를 기울여서 약간의 스크립트를 작성했습니다. 먼저 이것은 전체 폴더를 재귀 적으로 볼 수 있었지만 (Lester Buck의 예와 반대) 다른 곳에서 파일을보고 싶었으므로 확장했습니다.

결과는 현재라는 스크립트gitwatch 입니다. 즉, inotifywait를 사용하여 파일이나 폴더에서 변경 사항을 감시하고 git 저장소에 커밋합니다.

github에서 스크립트, 자세한 정보 및 지침을 찾을 수 있습니다 : https://github.com/nevik/gitwatch


4
유용한 작은 스크립트가 있습니다. 메모 해 드리겠습니다.
iwein

흥미로운 것은 마 젠토 사이트에 유용 할 것입니다. 테스트 중이지만 자동으로 푸시되지 않는 것 같습니다
NoSixties

16

git-wip 은 저에게 잘 맞는 훌륭한 솔루션입니다. "WIP"는 "작업 진행 중"을 나타냅니다. 'git wip'을 실행할 때마다 변경 사항이 별도의 분기로 커밋됩니다. 명령 행에서 실행할 수 있지만 파일을 작성할 때마다 git-wip을 자동으로 실행하는 vim 및 emacs의 확장자가 있습니다.


12

Windows 에서이 작업을 수행하고 싶었고 디렉토리 모니터 를 사용 하여 변경 사항을 확인한 다음 변경 사항이 감지되면 변경 사항을 감지하는 것이 가장 좋은 방법이라는 것을 알았습니다 .

프로그램 : cmd.exe

매개 변수 : /CC:\pathToBatchFile.bat

해당 배치 파일에는 다음이 포함되어 있습니다.

c:
cd c:\gitRepoDirectory\
(if exist "%PROGRAMFILES(X86)%" (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
) else (
"%PROGRAMFILES%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
))

또한 파일 ( "%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*") 을 추가하기 위해 다른 명령을 시도했지만 제대로 작동하지 않는다고 생각합니다.

또한 다음을 포함하는 커밋 후 후크를 만들었습니다.

#!/bin/sh
git.exe pull -v --progress  "origin"
git.exe push    --progress  "origin" master:master
curl.exe -s https://webserverdomain.com/updateFromGitHook.x?r=repoName

(충돌이 있으면 풀을 중단하고 푸시를 중단하지만, 그 일이 발생했음을 알 수있는 명확한 방법은 없었습니다. 결국 우리는이 한 가지 결함으로 인해 전체 아이디어를 포기했습니다.)

curl 명령은 서버에 코드를 가져와야한다고 말했습니다. PHP에서 처리하는 데 필요한 것은 다음과 같습니다.

<?
$r = $_GET['r'];
if (!empty($c)) {
    //use system instead of exec if you want the output to go back to the git client
    exec("cd /path/to/repo/parent/$r; sudo git reset --hard HEAD; sudo git pull;");
    echo "\n\nServer: Updated\n\n";
} else {
    echo "\n\nServer: UPDATE FAILED\n\n";
}
?>

그것의 유일한 문제는 아파치 사용자 대신 루트 사용자가 실행해야했기 때문에 /etc/sudoers.d/다음 을 포함 하는 파일을 만들어야했습니다 .

www-data ALL = NOPASSWD: /usr/bin/git

나를 위해, 나는 그것이 꽤 견실하게 작동했다고 생각합니다. 시작시 실행되도록 최소화하고 시작하도록 디렉토리 모니터를 구성 할 수 있으며 여러 다른 폴더를 볼 수 있습니다


또한 Windows에서는 LocalSystem에서 git을 실행할 수 없으므로 자체 모니터링 서비스를 만들면 실제로 Git을 실행할 수있는 사용자로 실행해야합니다. 어쩌면 일부 설정 / 구성이 누락되었지만 어쨌든 새로운 자식 커밋 계정을 설정하는 것이
좋습니다.

8
#!/bin/bash
git commit -a -m "autoupdate `date +%F-%T`"
git push

현재 날짜 및 시간으로 자동 푸시.


8

Inotify는 작업에 가장 적합한 도구 인 것 같습니다.

incron 이라는 도구 가 있으며 원하는 도구 가 될 수 있습니다. crontab과 같은 파일이나 폴더 (및 "change", "create", "unlink"와 같은 이벤트 유형)와 이러한 이벤트가 발생할 때 실행할 명령을 지정할 수 있습니다.

inotifywait (가난한 사람의 cron과 유사 할 것임)와 달리 sleep 10;do stuff, 이것은 첫 번째 이벤트뿐만 아니라 모든 이벤트를 포착합니다.

나는 그것을 직접 사용하지는 않았지만 문서에서 설정하기에는 너무 복잡해 보이지 않습니다.


7

로컬 Git 리포지토리에 자동 저장을 제공 하는 프로그램 GitPrime을 작성했습니다 . 버스트하기 전에 쉽게 롤백 할 수 있습니다! Bitbucket 리포지토리 .

이것은 Windows + Cygwin을 포함한 bash 쉘을 지원하는 모든 플랫폼에서 작동해야합니다.


+1 내가 예약 된 작업을 사용하여 매 10 분 자식-TF 저장소에 변경 사항을 자동 저장하는 창 (Cygwin에서)에 사용하고
Darbio

6

누구나 Powershell 에서이 작업을 수행하려고하면 다음을 사용하여 성공했습니다.

& "C:\Program Files (x86)\Git\bin\sh.exe" -c "cd D:\PATH\TO\REPO && git add --all  &&  git commit -m 'Automatic Commit Message Goes Here' && git push origin master"

5
그리고 이것이 어떻게 자동으로 트리거됩니까?
jerik

2
예정된 작업?
ozzy432836


2

파일 이름을 알고 있고 하나 (또는 ​​몇 개의 파일) 만 모니터링하려면 몇 분마다 "git commit"을 호출하면됩니다. 파일이 변경되지 않은 경우 git은 단지 불만을 표시 하고이 오류를 무시해야하지만 그 외에는 손상이 없습니다.

또한 수동으로 커밋 할 수 있도록 이러한 파일을 "자동 커밋"으로 표시해야합니다. 이런 방식으로, 사용자는 자동 변경 및 마지막 수동 커밋 이후에 변경된 커밋 설명과 함께 더 큰 "논리적"변경을 볼 수 있습니다.

예를 들어, 커밋 메시지로 "AUTOCOMMIT"을 사용하십시오. 나중에, git log를 사용하여 이러한 커밋을 제거하는 툴을 작성하거나 (kill을 수정하기 위해) "수동 커밋"을 망치기 위해 무차별 대입 충돌 해결 전략을 사용하여 AUTOCOMMIT 브랜치를 생성 할 수 있습니다.

또 다른 옵션은 git low-level 명령을 사용하여 고유 한 특수 저장소를 빌드하는 것입니다.

마지막으로, 자동 커밋을 수행하면서 수동 버전과 자동 버전을 구별하면서 파일을 새 이름 ( "$ filename.ac")으로 복사 할 수 있습니다.


1

사용자가 사용하는 편집기에 연결해야한다고 확신합니다. 변경 사항을 폴링 할 내용을 작성할 수 있지만 사용 패턴에 따라 폴링 빈도가 엄청나게 높아야 여러 변경 사항 대신 개별 변경 사항을 선택할 수 있습니다.


또한 변경 사항을 폴링하면 경쟁 조건이 발생합니다.
Bombe

1
충돌 후 데이터가 손실되지 않도록하기 위해 파일을 "트랜잭션 방식으로"작성하는 emacs 및 yi와 같은 편집기에서는 사용할 수 없습니다.
Robin Green

1

/ etc / *에 대한 모든 변경 사항을 git (또는 원하는 VCS)으로 자동 확인하도록 설계된 etckeeper 와 비슷한 것을 찾고있는 것처럼 들리지만 파일과 함께 사용할 수없는 이유는 없습니다. / etc에있는 것 이외의 것.

하나의 단일 파일 만 처리하려면 완벽하지 않을 수도 있지만 주어진 디렉토리의 모든 것을 추적하려면 체크인 할 가치가 있다고 생각합니다.


1

이 스크립트는 사용자가 파일을 변경할 때 실행되지 않지만 /etc/cron.* 디렉토리에 놓아서 cron 작업으로 실행할 수 있습니다.

이 스크립트는 / srv / www 디렉토리를 반복하고 (모든 사이트가 저장된 위치로 변경) 모든 파일을 추가, 커밋 및 푸시하고 모든 것을 /var/log/gitlog.txt에 기록합니다.

now=$(date +"%m.%d.%Y_%T")
logfile='/var/log/gitlog.txt'

for dir in /srv/www/*/
do
echo -e '\n' >> $logfile
echo "autocommit $dir $now" >> $logfile
echo "--------------------------" >> $logfile

cd $dir
git add . >> $logfile
git commit -am "autocommit $now" >> $logfile
git push origin master >> $logfile
done

0

나는 같은 문제가 있었고 Mac에서 시작하면 훌륭한 솔루션을 제공합니다. 파일이나 디렉토리를보고 변경 사항이 있으면 앱이나 다른 것을 실행할 수 있습니다 ...


"디렉토리 모니터링"을 참조하십시오 : developer.apple.com/library/mac/#documentation/MacOSX/…
Kris


0

이것은 질문의 "이상적으로"부분을 만족시키지 않지만, 내가 원하는 대답에 가장 가까운 질문이므로 여기에 갈 수 있다고 생각했습니다. 내 첫 번째 stackoverflow 게시물이므로 실수하면 사과드립니다.

다음 스크립트는 저장 변경에 자동 커밋을 보장하지만, 하지 의 입력을 저지를 사용자에게 프롬프트. (내 시나리오는 git-noob과 약간 다릅니다.)


# While running, monitors the specified directory, and when a file therein 
# is created or edited and saved, this prompts the user for a commit message.
# The --exclude is to avoid extra prompts for the changes made to 
# version control directories.

# requires inotify-tools

inotifywait --exclude '/\..+' -m  path/to/directory -e modify -e create |
        while read path action file; do
                gnome-terminal -e 'bash -c "cd path/to/directory; 
                                            git add *; 
                                            echo What did you just do??; 
                                            read varname; 
                                            git commit -m \"$varname\""'
        done

0

Windows의 경우

autocommit대한기사에 따르면 .bat컨텐츠가 포함 된 파일을 작성 해야합니다.

git add -u
git commit -m "your commit message"
git push origin master 

로 실행하십시오 Task Scheduler. 단계별로 수행하는 방법을 모르는 경우 해당 문서를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.