git을 사용하여 모든 변경 사항을 파일에 기록하고 싶습니다.
파일을 업데이트 할 때마다 git ‘commit’을 자동으로 설정하는 방법이 있습니까? 따라서 파일을 변경할 때마다 새로운 커밋이 있습니까?
이상적으로는 사용자가 자식이이면에서 실행되고 있음을 알지 못하도록하고 싶습니다. 그런 다음 사용자는 파일에 대한 변경 사항을 “실행 취소”할 수 있으며 이는 이전 버전을 git에서 가져 와서 달성 할 수 있습니다.
답변
Linux 에서는 파일 내용이 변경 될 때마다 inotifywait 를 사용 하여 자동으로 명령을 실행할 수 있습니다 .
편집 : 다음 명령은 file.txt가 저장 되 자마자 커밋합니다.
inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh
답변
이전의 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 를 다시 시작 하도록 일반화 될 수 있습니다 .
답변
이 작업에 대해 inotifywait 를 권장하는 이전 답변 은이 문제가 발생했을 때 올바른 방향으로 나를 기울여서 약간의 스크립트를 작성했습니다. 먼저 이것은 전체 폴더를 재귀 적으로 볼 수 있었지만 (Lester Buck의 예와 반대) 다른 곳에서 파일을보고 싶었으므로 확장했습니다.
결과는 현재라는 스크립트gitwatch
입니다. 즉, inotifywait를 사용하여 파일이나 폴더에서 변경 사항을 감시하고 git 저장소에 커밋합니다.
github에서 스크립트, 자세한 정보 및 지침을 찾을 수 있습니다 : https://github.com/nevik/gitwatch
답변
git-wip 은 저에게 잘 맞는 훌륭한 솔루션입니다. “WIP”는 “작업 진행 중”을 나타냅니다. ‘git wip’을 실행할 때마다 변경 사항이 별도의 분기로 커밋됩니다. 명령 행에서 실행할 수 있지만 파일을 작성할 때마다 git-wip을 자동으로 실행하는 vim 및 emacs의 확장자가 있습니다.
답변
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
나를 위해, 나는 그것이 꽤 견실하게 작동했다고 생각합니다. 시작시 실행되도록 최소화하고 시작하도록 디렉토리 모니터를 구성 할 수 있으며 여러 다른 폴더를 볼 수 있습니다
답변
#!/bin/bash
git commit -a -m "autoupdate `date +%F-%T`"
git push
현재 날짜 및 시간으로 자동 푸시.
답변
Inotify는 작업에 가장 적합한 도구 인 것 같습니다.
incron 이라는 도구 가 있으며 원하는 도구 가 될 수 있습니다. crontab과 같은 파일이나 폴더 (및 “change”, “create”, “unlink”와 같은 이벤트 유형)와 이러한 이벤트가 발생할 때 실행할 명령을 지정할 수 있습니다.
inotifywait (가난한 사람의 cron과 유사 할 것임)와 달리 sleep 10;do stuff
, 이것은 첫 번째 이벤트뿐만 아니라 모든 이벤트를 포착합니다.
나는 그것을 직접 사용하지는 않았지만 문서에서 설정하기에는 너무 복잡해 보이지 않습니다.