使用cronjob进行Git自动拉取

时间:2010-12-10 23:14:43

标签: git cron

我正在尝试创建一个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命令本身是正确的。我可以毫无错误地运行它。

6 个答案:

答案 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

我们必须设置工作目录