Git仓库自动拉取的关键是配置免密访问:SSH方式需确保私钥存在且URL为git@格式;HTTPS方式应使用凭据管理器缓存;推荐systemd用户级timer替代crontab,配合ssh-agent显式加载、工作目录权限校验及HEAD比对触发构建,并重定向日志便于排查。

Git仓库自动拉取的关键是避免交互式密码输入
直接用 git pull 在无人值守脚本里会卡住,因为 SSH 密钥没加载或 HTTPS 凭据缺失。必须提前配置免密访问,否则脚本永远停在认证环节。
- 推荐用 SSH 方式:确保
~/.ssh/id_rsa(或对应私钥)已存在,且远程仓库 URL 是git@github.com:user/repo.git格式 - 若必须用 HTTPS,别存密码在 URL 里(
https://user:pass@github.com/...),既不安全又容易被日志泄露;改用git config --global credential.helper store+ 首次手动拉一次触发凭据缓存(仅适用于低敏感环境) - 脚本开头加
eval $(ssh-agent -s) && ssh-add ~/.ssh/id_rsa可临时加载密钥,但注意ssh-agent生命周期需和脚本一致,否则子 shell 里失效
用 systemd timer 替代 crontab 更可靠地管理定时拉取
crontab 执行时的环境变量(如 $HOME、$PATH)和用户登录态不一致,常导致 git 找不到、SSH agent 不可用、或工作目录错误。systemd 用户级 timer 能继承完整用户环境。
- 写服务单元
~/sync-repo.service:[Unit] Description=Sync my app repo Wants=network-online.target <p>[Service] Type=oneshot WorkingDirectory=/home/user/myapp ExecStart=/usr/bin/git -C /home/user/myapp pull origin main User=user Environment=GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no"</p>
- 配定时器
~/sync-repo.timer(每5分钟检查一次):[Unit] Description=Run sync-repo every 5 minutes <p>[Timer] OnCalendar=<em>:</em>\/5 Persistent=true</p><p>[Install] WantedBy=timers.target</p>
- 启用:
systemctl --user daemon-reload→systemctl --user enable --now sync-repo.timer
拉取后判断是否真有更新再触发构建
每次 git pull 都跑构建浪费资源,尤其编译耗时长时。得比对 HEAD 是否变化,而不是只看命令返回值(Already up to date 也返回 0)。
自动采集数据并生成 Web3 行业资本运作周报,包括融资、监管、上市公司 DAT、并购与 RWA 项目动态。用户提到‘写周报’、‘生成周报’、‘整理本周融资’、‘Web3 周报’、‘资本运作周报’、‘采编周报’,或请求整理本周加密行业动态时,立即激活本技能。即使用户仅说‘帮我写本周的’...
- 用
git rev-parse HEAD记录上次提交哈希,拉取后再比对: - 示例片段(放在 service 的
ExecStart后续):cd /home/user/myapp PREV=$(cat .last_commit 2>/dev/null || echo "") git pull origin main CUR=$(git rev-parse HEAD) if [ "$PREV" != "$CUR" ]; then echo "$CUR" > .last_commit make build # 或你的构建命令 fi
- 注意
.last_commit文件权限要允许当前用户读写,且路径写绝对路径更稳
构建失败时别静默吞掉错误,得留痕可查
后台运行的脚本一旦出错没日志,问题就石沉大海。不能只依赖终端输出,得明确重定向 stderr 和 stdout。
- 在 service 文件里加日志重定向:
StandardOutput=append:/home/user/logs/repo-sync.log,StandardError=append:/home/user/logs/repo-sync.log - 构建命令本身也要带错误检查,比如
make build || echo "Build failed at $(date)" >> /home/user/logs/repo-sync.log - 避免用
set -e简单兜底——它会在git pull返回非零(如网络超时)时直接退出,反而掩盖了“拉取失败但构建未跑”的真实状态
实际部署时最容易忽略的是 SSH agent 的作用域和 WorkingDirectory 权限。systemd --user 服务默认不继承登录 session 的 agent,必须显式启动并添加密钥;而 git -C 路径若指向 root 拥有的目录,普通用户 service 就根本进不去。










