我正在尝试创建一个cronjob,其任务是每分钟执行一次git pull
,以使我的生产站点与我的主分支同步。
由于权限问题,git pull需要由系统用户nobody
完成。但是,似乎nobody
帐户不允许运行命令。所以我必须以root
用户身份创建任务。
我试过的crontab条目:
*/1 * * * * su -s /bin/sh nobody -c 'cd ~heilee/www && git pull -q origin master' >> ~/git.log
它不起作用,我不知道如何调试它。
有人可以帮忙吗?
UPDATE1:git pull
命令本身是正确的。我可以毫无错误地运行它。
答案 0 :(得分:27)
解决方案:
*/1 * * * * su -s /bin/sh nobody -c 'cd ~dstrt/www && /usr/local/bin/git -q pull origin master'
答案 1 :(得分:10)
虽然你确实需要弄清楚如何让更新在第一时间工作,但你最好还是使用上游的钩子来实现它。您只需使用post-commit
钩子中的curl即可完成此操作,或者如果您使用的是github,只需使用后端接收挂钩即可。
答案 2 :(得分:5)
*/1 * * * * su -s /bin/sh nobody -c 'cd /home/heilee/src/project && /usr/bin/git pull origin master'
这可以纠正一些错误,这些错误阻止了我的系统(Ubuntu> 10.04服务器)上的已接受答案。关键更改似乎是-q
之后的pull
而不是之前的/var/log/syslog
。在拖尾{{1}}文件或尝试运行未更新的生产代码之前,您不会注意到您的工作没有效果。
答案 3 :(得分:3)
#!/bin/bash
cd /home/your_folder/your_folder && /usr/bin/git pull git@bitbucket.org:your_user/your_file.git
这是我一直在使用和工作
答案 4 :(得分:2)
在撰写此答案时,所有建议的解决方案都以 cd
进入工作目录开始。我个人更喜欢使用 git-dir
参数。
git --git-dir=/path/to/project/.git pull
出于我自己的目的,我使用这个 cron 来使我的本地开发箱与其他开发人员保持同步。因此我使用 fetch
而不是 pull
*/15 * * * * git --git-dir=/home/andey/Dropbox/Projects/springbig/.git fetch -a
为了简化当前接受的解决方案,使用 git-dir
参数
*/1 * * * * su -s /bin/sh nobody -c '/usr/local/bin/git --git-dir=~dstrt/www pull origin master'
答案 5 :(得分:1)
我创建了一个小脚本来处理它。然后可以使用by命令crontab
crontab -e
0 2 * * * cd /root && ./gitpull.sh > /root/log/cron.log 2>&1 &
以下是gitpull.sh
:
#!/bin/bash
source /etc/profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export TERM=${TERM:-dumb}
#----------------------------------------
# Please set the following variable section
# Please set up working directories, use','split
# eg:path="/root/test/path1,/root/test/path2"
path=""
#----------------------------------------
# Do not edit the following section
# Check if user is root
[ $(id -u) != "0" ] && { echo "${CFAILURE}Error: You must run this script as root.${CEND}"; exit 1; } 2>&1
# Check if directory path exists
if [[ "${path}" = "" ]]; then
echo "${CFAILURE}Error: You must set the correct directory path.Exit.${CEND}" 2>&1
exit 1
fi
# Check if command git exists
if ! [ -x "$(command -v git)" ]; then
echo "${CFAILURE}Error: You may not install the git.Exit.${CEND}" 2>&1
exit 1
fi
# Check where is command git
git_path=`which git`
# Start to deal the set dir
OLD_IFS="$IFS"
IFS=","
dir=($path)
IFS="$OLD_IFS"
echo "Start to execute this script." 2>&1
for every_dir in ${dir[@]}
do
cd ${every_dir}
work_dir=`pwd`
echo "---------------------------------" 2>&1
echo "Start to deal" ${work_dir} 2>&1
${git_path} pull
echo "---------------------------------" 2>&1
done
echo "All done,thanks for your use." 2>&1
我们必须设置工作目录