git commit在cron作业中不起作用,虽然git pull确实有用

Ere*_*evi 8 git crontab

在我的crontab中,我有以下几行:

48 14 * * * bash /home/erelsgl/git/erel-sites/add-commit-push.bash "from home" 2&>1 >> /home/erelsgl/logs/backup_from_home.log
Run Code Online (Sandbox Code Playgroud)

该脚本按其名称暗示 - 添加,提交和推送:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $DIR
echo --------------------
date
echo == add ==
/usr/bin/git add -A
echo == commit ==
/usr/bin/git commit -m "$1"
echo == pull ==
/usr/bin/git pull
echo == push ==
/usr/bin/git push
Run Code Online (Sandbox Code Playgroud)

如日志文件中所示,"提交"不执行任何操作,而"拉"工作正常:

Fri Oct 23 14:48:01 IDT 2015
== add ==
== commit ==
== pull ==
Already up-to-date.
== push ==
Run Code Online (Sandbox Code Playgroud)

一分钟后,我从命令行运行完全相同的命令,并得到以下日志,这意味着提交确实发生了:

Fri Oct 23 14:49:31 IDT 2015
== add ==
== commit ==
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean
== pull ==
Already up-to-date.
== push ==
Run Code Online (Sandbox Code Playgroud)

从cron作业运行提交有什么问题?

注意:我也对测试文件中的实际更改进行了相同的实验.我发现,实际上,提交没有发生在crontab上(没有任何东西被推到上游),但确实是从命令行发生的.

Von*_*onC 7

cronsh默认情况下使用,请尝试,如" 如何将输出重定向到cron中的文件? "中所述:

  • 没有'bash'
  • 2>&1

那是:

48 14 * * * /home/erelsgl/git/erel-sites/add-commit-push.bash "from home" >> /home/erelsgl/logs/backup_from_home.log 2>&1
Run Code Online (Sandbox Code Playgroud)

并在你的bash脚本中添加一个shebang指令:

#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $DIR
...
Run Code Online (Sandbox Code Playgroud)

另一种形式是使用bash命令行(如" 重定向cron作业的输出 "):

48 14 * * *  /bin/bash -l -c '/path/to/script >> ./log/my_log.log 2>&1'
Run Code Online (Sandbox Code Playgroud)

在按照建议更改重定向顺序后,我的日志文件确实显示了一条很长的错误消息:

Please tell me who you are. 
Run git config --global user.email "you@example.com" 
    git config --global user.name "Your Name" 
to set your account's default identity
Run Code Online (Sandbox Code Playgroud)

我已经在我的帐户中执行了此操作,但是cron作业可能找不到配置文件.如何让它找到正确的git配置文件?

cron作业可能与另一个帐户(或root)一起运行:它的全局git config(~/.gitconfig)与您在用户帐户中设置的不一样.

一个简单的解决方案是在目标git repo中重复那些git配置(没有--global):这将在repo本身中注册用户id,而不是依赖于不在帐户之间共享的全局配置.