쉘 스크립트에서 Git 저장소로 푸시

쉘 스크립트에서 Git 저장소로 푸시

다음 샘플 코드를 사용하여 원격 Git 서버에 변경 사항을 커밋/푸시하려고 합니다.

#!/bin/sh

USER='username'
REPO='/home/'${USER}'/Sites/git/bitbucket/kb'
COMMIT_TIMESTAMP=`date +'%Y-%m-%d %H:%M:%S %Z'`
DATELOG=`date +'%Y-%m-%d-%H-%M-%S'`
LOG="/tmp/${DATELOG}.txt"

MKDOCS=`which mkdocs`
GIT=`which git`
NOTIFY=`which notify-send`

# Only proceed if we have a valid repo.
if [ ! -d ${REPO}/.git ]; then
  echo "${REPO} is not a valid git repo! Aborting..." >> ${LOG}
  exit 0
else
  echo "${REPO} is a valid git repo! Proceeding..." >> ${LOG}
fi

cd ${REPO}
${MKDOCS} build --clean >> ${LOG}
${GIT} add --all . >> ${LOG}
${GIT} commit -m "Automated commit on ${COMMIT_TIMESTAMP}" >> ${LOG}
${GIT} push [email protected]:username/repo.git master >> ${LOG}

# Depends on libnotify
${NOTIFY} 'KB notification' 'Changes were pushed to Bitbucket.' --icon=dialog-information >> ${LOG}

쉘 스크립트를 수동으로 호출하면(예 ./commit.sh: ) 즉시 실행됩니다. 대신 cron 작업을 통해 트리거되면 git push이상한 이유로 트리거되지 않는 것처럼 보일 때까지 모든 것이 잘 작동합니다.

이것은 내 crontab 라인입니다:

*/20 * * * * /home/username/Sites/git/repo/commit.sh

그리고 좀 긴 내용git push

09:53:32.732216 git.c:349               trace: built-in: git 'push' '[email protected]:username/repo.git' 'master'
09:53:32.732514 run-command.c:341       trace: run_command: 'ssh' '[email protected]' 'git-receive-pack '\''username/repo.git'\'''
09:53:39.665197 run-command.c:341       trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
09:53:39.665526 exec_cmd.c:134          trace: exec: 'git' 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
09:53:39.666778 git.c:349               trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 4.23 KiB | 0 bytes/s, done.
Total 7 (delta 4), reused 0 (delta 0)
To [email protected]:username/repo.git
   0ef4905..91437d0  master -> master

git push스크립트를 수동으로 호출할 때만 실행되고 crontab을 통해 실행될 때는 실행되지 않는 이유는 무엇 입니까?

답변1

어떤 감독이 이 일을 했으면 좋겠나요? 스크립트에서 명확하지 않습니다. 아래와 같이 디렉터리 1 로 이동해 보세요 .

#!/bin/sh

GIT=`which git`
REPO_DIR=/home/username/Sites/git/repo/
cd ${REPO_DIR}
${GIT} add --all .
${GIT} commit -m "Test commit"
${GIT} push [email protected]:username/repo.git master

아니면 하나 만들 수도 있습니다 git add --all /path/to/git/repo/files.

편집하다:

명령줄에서 스크립트를 실행하는 것은 cron에서 실행하는 것과 반드시 ​​동일하지는 않습니다. 이 Q&A를 참조하세요.cron이 작업을 실행할 때 "작업 디렉터리"는 무엇입니까?, 특히자일스의 대답.

1 이를 수행하는 방법에 대한 몇 가지 아이디어명령이 성공했는지 확인

답변2

나는 같은 문제가 있었고 이것이 내가 해결 한 방법입니다.

  1. 먼저, 푸시 오류의 원인이 무엇인지 알아내십시오. 2>&1스크립트 끝에 추가하면 오류 로그를 얻을 수 있습니다 . 귀하의 경우에는 다음과 같습니다:

    ${GIT} push [email protected]:username/repo.git master >> ${LOG} 2>&1
    
  2. 푸시가 셸 내에서 실행되지 않는 데에는 여러 가지 이유가 있습니다. 다음 기준을 확인하세요.

    • 귀하의 사용자 이름과 비밀번호는 올바르게 저장/캐시되었습니다. 테스트용 사용자/패스를 포함하여 git URL로 직접 푸시할 수 있습니다(제거하는 것을 잊지 마세요). 예를 들어:

      ${GIT} push --repo https://YOUR_USER_NAME:[email protected]/repo.git  
      
    • Git이 SSL에 대해 불평하지 않는지 확인하세요.일시적으로push스크립트 앞부분에 다음 명령을 추가하여 무시하십시오.

      export GIT_SSL_NO_VERIFY=1
      
  3. 올바른 디렉터리에서 실행 하지 않는 경우 다음과 같이 git push작업에 사전 단계를 추가하여 스크립트를 실행하기 전에 원하는 디렉터리로 이동할 수 있습니다 .cron

    */20 * * * * cd /home/'${USER}'/Sites/git/bitbucket/kb && /home/username/Sites/git/repo/commit.sh
    

관련 정보