git을 사용하여 모든 변경 사항을 파일에 기록하고 싶습니다.
파일을 업데이트 할 때마다 git 'commit'을 자동으로 설정하는 방법이 있습니까? 따라서 파일을 변경할 때마다 새로운 커밋이 있습니까?
이상적으로는 사용자가 자식이이면에서 실행되고 있음을 알지 못하도록하고 싶습니다. 그런 다음 사용자는 파일에 대한 변경 사항을 "실행 취소"할 수 있으며 이는 이전 버전을 git에서 가져 와서 달성 할 수 있습니다.
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
-r
플래그를 사용 inotifywait
하되, 커널은 설정할 수있는 inotifywait 워치 수에 제한이 있습니다. man inotifywait
당신에게 더 말할 것입니다.
이전의 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
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
나를 위해, 나는 그것이 꽤 견실하게 작동했다고 생각합니다. 시작시 실행되도록 최소화하고 시작하도록 디렉토리 모니터를 구성 할 수 있으며 여러 다른 폴더를 볼 수 있습니다
Inotify는 작업에 가장 적합한 도구 인 것 같습니다.
incron 이라는 도구 가 있으며 원하는 도구 가 될 수 있습니다. crontab과 같은 파일이나 폴더 (및 "change", "create", "unlink"와 같은 이벤트 유형)와 이러한 이벤트가 발생할 때 실행할 명령을 지정할 수 있습니다.
inotifywait (가난한 사람의 cron과 유사 할 것임)와 달리 sleep 10;do stuff
, 이것은 첫 번째 이벤트뿐만 아니라 모든 이벤트를 포착합니다.
나는 그것을 직접 사용하지는 않았지만 문서에서 설정하기에는 너무 복잡해 보이지 않습니다.
로컬 Git 리포지토리에 자동 저장을 제공 하는 프로그램 GitPrime을 작성했습니다 . 버스트하기 전에 쉽게 롤백 할 수 있습니다! Bitbucket 리포지토리 .
이것은 Windows + Cygwin을 포함한 bash 쉘을 지원하는 모든 플랫폼에서 작동해야합니다.
누구나 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"
두 솔루션은 내가 좋아하는 것을하다 etckeeper -하는 사용자 정의 디렉토리에 적용 할 수 있습니다 이외 /etc
:
mkdir /foo
etckeeper -d /foo init`
etckeeper -d /foo commit 'message'
그리고 gitwatch- 특히 그것을 사용하는 방법에supervisord
대한 지침 .
파일 이름을 알고 있고 하나 (또는 몇 개의 파일) 만 모니터링하려면 몇 분마다 "git commit"을 호출하면됩니다. 파일이 변경되지 않은 경우 git은 단지 불만을 표시 하고이 오류를 무시해야하지만 그 외에는 손상이 없습니다.
또한 수동으로 커밋 할 수 있도록 이러한 파일을 "자동 커밋"으로 표시해야합니다. 이런 방식으로, 사용자는 자동 변경 및 마지막 수동 커밋 이후에 변경된 커밋 설명과 함께 더 큰 "논리적"변경을 볼 수 있습니다.
예를 들어, 커밋 메시지로 "AUTOCOMMIT"을 사용하십시오. 나중에, git log를 사용하여 이러한 커밋을 제거하는 툴을 작성하거나 (kill을 수정하기 위해) "수동 커밋"을 망치기 위해 무차별 대입 충돌 해결 전략을 사용하여 AUTOCOMMIT 브랜치를 생성 할 수 있습니다.
또 다른 옵션은 git low-level 명령을 사용하여 고유 한 특수 저장소를 빌드하는 것입니다.
마지막으로, 자동 커밋을 수행하면서 수동 버전과 자동 버전을 구별하면서 파일을 새 이름 ( "$ filename.ac")으로 복사 할 수 있습니다.
사용자가 사용하는 편집기에 연결해야한다고 확신합니다. 변경 사항을 폴링 할 내용을 작성할 수 있지만 사용 패턴에 따라 폴링 빈도가 엄청나게 높아야 여러 변경 사항 대신 개별 변경 사항을 선택할 수 있습니다.
이 스크립트는 사용자가 파일을 변경할 때 실행되지 않지만 /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
나는 같은 문제가 있었고 Mac에서 시작하면 훌륭한 솔루션을 제공합니다. 파일이나 디렉토리를보고 변경 사항이 있으면 앱이나 다른 것을 실행할 수 있습니다 ...
이 작은 쉘 스크립트를 만들어 파일 상태를 모니터링하고 빌드 성공시 git commit과 같은 명령을 트리거했습니다.
자유롭게 다운로드하여 사용해보십시오.
https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh
이것은 질문의 "이상적으로"부분을 만족시키지 않지만, 내가 원하는 대답에 가장 가까운 질문이므로 여기에 갈 수 있다고 생각했습니다. 내 첫 번째 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
autocommit 에 대한 이 기사에 따르면 .bat
컨텐츠가 포함 된 파일을 작성 해야합니다.
git add -u
git commit -m "your commit message"
git push origin master
로 실행하십시오 Task Scheduler
. 단계별로 수행하는 방법을 모르는 경우 해당 문서를 참조하십시오.