crontab配置git命令报错

需求:
在linux crontab中配置git定时拉取和提交的命令
0 */1 * * * cd /services/apps/scripts && /usr/bin/git pull

在实际过程中,上述执行是会报错了的

默认情况下crontab的执行日志会以mail的形式返给当前用户,如果需要查看,直接在控制台执行mail命令就能看到执行日志

错误1:没有权限读取文件
原因:crontab中的运行环境和默认环境不一致,无法读取mac非User目录下的文件
解决方法:将文件夹迁移至User下

错误2:fatal: could not read Username for ‘url’: Device not configured
原因:在默认环境中mac会记住git仓库的账号密码,但crontab环境不知道账号密码
解决方法:进入项目文件夹下open .git/config,在url中加入账号和密码,改为以下格式即可 https://[userName]:[password]@gitee.com/[username]/project.git
完整配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = https://[userName]:[password]@gitee.com/[username]/project.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = [name]
email = [email]

这里需要注意的是:如果用户名密码包含特殊字符,比如@!等等,也是会报错的,需要对特殊字符进行url encode。所以这里建议直接把用户名和密码都url encode之后再填写到url中
如果用户名是`username@126.com,那么encode之后的url就是https://username%40126.com:[password]@gitee.com/[username]/project.git`
密码同理

错误3:git命令无效
原因:crontab的环境变量中不包含git的路径
解决方法:使用git的绝对路径,如 /usr/bin/git pull origin master