--- title: 记一个post-receive的配置记录 description: 个人博客post-receive配置时踩的一点坑 date: 2025-02-12T20:18:00+08:00 slug: post-receive # image: helena-hertz-wWZzXlDpMog-unsplash.jpg categories: - 奇技淫巧 tags: [ "git", "建站", "Hugo" ] lastmod: 2025-02-12T20:20:00+08:00 --- 我在使用自建 Gitea 服务配置博客的自动部署时,最初的`post-receive`配置如下: ```bash #!/usr/bin/env bash # AUTO GENERATED BY GITEA, DO NOT MODIFY data=$(cat) exitcodes="" hookname=$(basename $0) GIT_DIR=${GIT_DIR:-$(dirname "$0")/..} for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do test -x "${hook}" && test -f "${hook}" || continue echo "${data}" | "${hook}" exitcodes="${exitcodes} $?" done for i in ${exitcodes}; do [ ${i} -eq 0 ] || exit ${i} done WORK_TREE=(保密) HUGO_BIN=(保密) TMP_DIR=$(mktemp -d) git --git-dir="$GIT_DIR" archive master | tar -x -C "$TMP_DIR" cd "$TMP_DIR" $HUGO_BIN rsync -av --delete "$TMP_DIR/public"/ "$WORK_TREE"/ rm -rf "$TMP_DIR" { echo "=== Deployment Log ===" echo "Timestamp : $(date +"%Y-%m-%d %T %Z")" echo "User : $(whoami)" echo "Commit Hash: $(git --git-dir="$GIT_DIR" rev-parse HEAD)" echo "Work Tree : $WORK_TREE" echo "Git Dir : $GIT_DIR" echo "Status : Success (Built with Hugo and deployed)" echo "" } >> "$GIT_DIR/log/git-deploy.log" ``` 其中1-16行是 Gitea 自动生成的,所以一开始我没管。但是push之后发现,每次都报错: ``` remote: mkdir: cannot create directory './log': No such file or directory remote: hooks/post-receive: line 50: ./log/git-deploy.log: No such file or directory ``` 这个目录和文件是存在的,一开始以为是权限问题,但是检查之后发现权限是正确的。我心想真是奇了怪了,会不会是`GIT_DIR`变量赋值有问题呢?但是看起来是正确的。随后试了几次,仍然报一样的错,于是我`echo`了一下`GIT_DIR`,发现是`.`,这就有问题了。 换言之,`GIT_DIR`变量赋值是一个**相对路径**,而不是绝对路径。尤其是我后面还`cd`了临时目录,会导致脚本目录混乱。于是,我把`GIT_DIR`变量赋值改成了绝对路径: ```bash GIT_DIR=$(realpath ${GIT_DIR:-$(dirname "$0")/..}) ``` 后来再`push`一次,脚本仍然报错,不过这次是: ``` remote: fatal: Unable to read current working directory: No such file or directory ``` 我再查看了一次脚本,发现是`cd`了临时目录,之后把临时目录删了,导致脚本在一个不存在的目录下工作。于是在`rm -rf`之前,先`cd $GIT_DIR/hooks`回到脚本正常工作目录下,再`rm`就没问题了。