Git:更新后挂钩,运行需要访问存储库中所有文件的脚本

时间:2009-10-13 03:11:44

标签: git hook post-update

我现在遇到了一些困境,因为每当远程存储库更新时(即每当有人运行git push时)我都需要一个脚本来运行,它可以从存储库中的文件构建软件包。然后将这些包放入git服务器上的一个目录中,该目录通过HTTP向客户端公开以供将来使用。

问题是,我不确定如何在更新后的钩子中访问存储库中的文件。

如果有人能提供一些见解,我们将非常感激。

2 个答案:

答案 0 :(得分:3)

首先,您可能希望使用post-receive挂钩而不是post-update。根据{{​​3}}手册页,post-receive会取代更新后的内容。

也就是说,你的钩子脚本是在.git / hooks子目录中执行的,所以如果你做一个简单的

cd ..

您的脚本位于git存储库的工作树中。例如,这是一个很小的脚本,可以确保每当您推送到存储库时都会更新远程git存储库的工作树:

#!/bin/sh
export GIT_DIR=
cd ..
echo "Resetting working tree..."
git reset --hard
echo "Finished resetting working tree."

请注意,您需要取消设置GIT_DIR环境变量;它会自动设置,只要它的设置,所有git命令都将在该目录中运行 - 无论你在哪里进行。

答案 1 :(得分:1)

如果您的远程代理是裸共享仓库,则没有文件副本。 你可以改变它,然后你就必须运行自动结账。

如果您的包装中有文件,最好还是将备份放在单独的目录中

我将以下内容用于您命名的确切目的

这是博客文章,向我展示了如何设置它 http://toroid.org/ams/git-website-howto

这是我在下面的摘要说明

在repo之外创建一个目录并将工作树放在那里,然后使它不再是一个裸仓库,因此有一个文件的副本,然后在运行打包脚本之前运行一个

            # create the repo with files that live in a seperate folder
            cd /share/proj/all/$1/repo
            git --bare init --shared
            git config core.worktree ../actual
            git config core.bare false
            git config receive.denycurrentbranch ignore
            # add a hook to checkout the repo into the files directory automatically on push
            echo "#!/bin/sh" > hooks/post-receive
            echo "git checkout -f" >> hooks/post-receive
            chmod +x hooks/post-receive