从 shell 脚本推送到 Git 存储库

从 shell 脚本推送到 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}

如果我手动调用 shell 脚本(例如./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 运行脚本相同;请参阅此问答:cron 执行作业时的“工作目录”是什么, 尤其吉尔斯的回答

1关于如何做的一些想法检查命令是否成功

答案2

我遇到了同样的问题,这就是我解决它的方法:

  1. 首先,尝试找出你的推送错误是什么原因。您可以通过2>&1在脚本末尾添加来获取错误日志。在你的情况下,它将是:

    ${GIT} push [email protected]:username/repo.git master >> ${LOG} 2>&1
    
  2. 有几个原因可能会导致您的推送无法在 shell 内运行。检查这些标准:

    • 您的用户名和密码已正确存储/缓存。您可以直接推送到 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
    

相关内容