prosource

git 자동 커밋 만들기

probook 2023. 6. 22. 21:57
반응형

git 자동 커밋 만들기

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

파일이 업데이트될 때마다 Git 'commit'이 자동으로 실행되도록 설정할 수 있는 방법이 있습니까? 그러면 파일이 변경될 때마다 새로운 커밋이 있습니까?

이상적으로 나는 내 사용자들이 Git이 배후에서 실행되고 있다는 것조차 알지 못했으면 합니다.그런 다음 사용자가 파일 변경을 "실행 취소"할 수 있으며, 이전 버전을 git에서 제거하면 이 작업을 수행할 수 있습니다.

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

편집: 다음 명령 커밋 파일.저장되는 즉시 txt:

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

이전의 innotify wait 답변도 좋지만, 완전한 해결책은 아닙니다.기록된 바와 같이, 이는 파일의 일회성 변경에 대한 원샷 커밋입니다.파일을 편집하면 원래 이름을 가진 새 아이노드가 생성되는 일반적인 경우에는 작동하지 않습니다.innotify wait - m은 이름이 아닌 i노드별로 파일을 따릅니다.또한 파일이 변경된 후에는 git add 또는 git commit -a 없이 git commit에 대해 준비되지 않습니다.다음은 데비안에서 일정관리 파일의 모든 변경사항을 추적하기 위해 사용하는 내용입니다.

/etc/rc.local:


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

/home/<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

이는 일반적으로 파일 및/또는 디렉토리 목록에서 대기하고 해당 대기 프로세스에 통보한 후 파일이 변경될 때 각 대기 상태를 다시 시작하도록 할 수 있습니다.

이 일에 대해 미리 알려달라는 이전 답변들은 제가 이 문제를 겪었을 때 올바른 방향을 알려주었기 때문에 저는 약간의 대본을 작성했습니다.처음에는 전체 폴더를 재귀적으로만 볼 수 있었지만(레스터 벅의 예와는 반대) 다른 곳에서 파일을 보고 싶어서 확장했습니다.

결과는 현재 호출된 스크립트입니다.gitwatch파일이나 폴더의 변경 사항을 감시하고(inotifywait 사용) 깃 저장소에 커밋합니다.

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

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

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

(충돌이 발생하면 당기기를 중단하고 밀어내기를 중단할 것이지만, 그런 일이 발생했는지 알 수 있는 명확한 방법은 없었습니다. 결국 우리는 이 한 가지 결함 때문에 모든 아이디어를 포기했습니다.)

그 컬 명령어는 제 서버에 코드를 풀해야 한다고 말했습니다.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

저는 그것이 꽤 확실하게 효과가 있었다고 생각합니다.시작 시 실행되고 시작을 최소화하도록 Directory Monitor를 구성할 수 있으며 여러 폴더를 감시할 수 있습니다.

정보 알림은 정말로 업무에 적합한 도구인 것 같습니다.

당신이 찾고 있는 것과 정확히 일치할 수 있는 incron이라는 도구가 있습니다.파일이나 폴더(및 "변경", "생성", "연결 해제" 등)를 crontab 및 이러한 이벤트가 발생할 때 실행할 명령어로 지정할 수 있습니다.

wait (의 크론의 될으로, "innotify wait"입니다.sleep 10;do stuff), 이것은 첫 번째 이벤트뿐만 아니라 모든 이벤트를 잡을 것입니다.

제가 직접 사용해본 적은 없지만 설명서를 보니 설정하기에 너무 복잡해 보이지는 않습니다.

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

현재 날짜 및 시간으로 자동 실행합니다.

저는 지역 Git 저장소에 자동 저장 기능을 제공하기 위해 GitPrime이라는 프로그램을 만들었습니다.이제 당신이 그것을 부수기 전으로 돌아가기 쉽습니다!비트 버킷 리포지토리입니다.

이 기능은 윈도우즈+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 -- 특히 사용 방법에 대한 지침.

이 스크립트는 사용자가 파일을 변경할 때 실행되지 않지만 /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

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

또한 이러한 파일을 "자동 커밋"으로 표시하여 수동으로 커밋할 수도 있습니다.이러한 방식으로 사용자는 자동 변경 사항과 마지막 수동 커밋 이후 변경된 사항을 설명하는 커밋 주석이 수반되는 더 큰 "논리적" 변경 사항을 확인할 수 있습니다.

예를 들어, 커밋 메시지로 "AUTOCOMMIT"를 사용합니다.나중에 git log를 사용하여 이러한 커밋을 정리하는 도구를 작성하거나(죽일 수정사항을 찾기 위해) 무차별 대입 충돌 해결 전략을 사용하여 분기 AUTOCOMMIT를 생성하여 "수동 커밋"을 해머할 수 있습니다.

또 다른 옵션은 git 로우 레벨 명령을 사용하여 전용 저장소를 구축하는 것입니다.

마지막으로 수동 버전과 자동 버전을 구분하기 위해 자동 커밋을 수행하는 동안 파일을 새 이름("$filename.ac ")으로 복사할 수 있습니다.

etckeeper와 유사한 것을 찾고 있는 것처럼 들리지만, 이는 /etc/*에 대한 모든 변경 사항을 git(또는 원하는 VCS)로 자동 검사하도록 설계되어 있습니다. 하지만 /etc에 있는 파일 이외의 파일에서 사용할 수 없을 이유는 없습니다.

하나의 파일만 처리하려면 완벽하지 않을 수도 있지만 지정된 디렉토리의 모든 내용을 추적하려면 확인해 볼 가치가 있다고 생각합니다.

Windows의 경우

자동 커밋에 대한 이 기사에 따르면, 당신은 다음을 만들어야 합니다..bat내용이 포함된 파일:

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

으로실다니로 합니다.Task Scheduler단계별로 하는 방법을 모르면 그 기사를 참고하세요.

보다 현대적인 방식으로inotifywait접근법은 entr을 사용하는 것입니다.다음과 같은 간단한 작업을 수행할 수 있습니다.

find . | entr git commit -avm "msg"

이렇게 하면 git로 알려진 파일에 대한 변경 내용이 자동으로 커밋됩니다.

사용자가 사용하는 편집기에 연결해야 합니다.변경 사항을 폴링하기 위해 무언가를 작성할 수 있지만, 사용 패턴에 따라 폴링 빈도가 매우 높아야 여러 변경 사항 대신 개별 변경 사항을 선택할 수 있습니다.

저도 같은 문제가 있었고 맥 런칭드는 당신에게 훌륭한 해결책을 제공합니다.파일이나 디렉터리를 보고 변경 사항이 있으면 앱이나 다른 것을 실행할 수 있습니다.

저는 파일 상태를 모니터링하고 git commit on build success와 같은 명령을 트리거하기 위해 이 작은 셸 스크립트를 만들었습니다.

자유롭게 다운로드하여 사용해 보십시오.

https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh

이것은 질문의 "이상적인" 부분을 만족시키지는 못하지만, 이것은 제가 원하는 답에 가장 가까운 질문이었습니다. 그래서 저는 이것이 여기에 적용될 수 있다고 생각했습니다.하지만 나의 첫 번째 스택 오버플로 게시물이니, 내가 잘못 알았다면 미안합니다.

다음 스크립트는 저장된 변경 사항에 대한 자동 커밋을 보장하지만 사용자에게 커밋 입력을 요청합니다. (제 시나리오는 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

몇 가지 대안이 있습니다.

  • 사전 정의된 간격에 따라 자동으로 변경을 커밋할 수 있습니다.
  • 또한 파수꾼이 있습니다.
  • 그리고 깃워치
  • git 파일(임의).sh) s)

    • `git add .
       git commit -am "auto commit"
       git push`
      
  • 배치 파일(*.bat)

    • %windir%\system32\CMD.exe /k git-bash.exe c:/yourapp/autocommit.sh
  • Windows 작업 스케줄러

    • 태스크 생성

나에게 그것은 효과가 있습니다. 그것이 일부에게 도움이 되기를 바랍니다.

언급URL : https://stackoverflow.com/questions/420143/making-git-auto-commit

반응형