2

我正在使用 Gitosis (Debian Lenny) 开发一个 Web 应用程序,我希望它能够推送到不同的远程存储库/位置,从而允许应用程序的“前沿”、“发布候选”和“生产”版本镜像物理 Web 目录和代码库。我希望每个目录都有应用程序的一个分支。所以一个存储库,三个“实时”版本。

我是 Git 新手,所以可能有更好的解决方案,但到目前为止我想出的方法是找到一种将钩子附加到分支的方法(我还没有找到),或者编写一个钩子来过滤哪个分支正在提交。

我的问题是如何设置一个更新后挂钩来检查提交的分支,为基于该分支的目录设置一个变量,然后将代码库复制到可以通过 HTTP 立即访问的目录中?

git rev-list --branches --pretty=oneline --max-count=1

将返回类似:

cc5112ba59bc82f2e847ac264317c062ce80f69f test commit

但我需要分支本身的名称,如“实验”或“大师”。

所以基本上我正在寻找类似的东西:

1) 获取刚刚提交的分支的名称(例如“master”、“experimental”)到一个字符串中

2) 使用 Bash case 声明使用什么目录

3) 运行类似“git archive --format=tar HEAD | (cd $LOCATION && tar xf -)”的内容,其中位置是从案例返回的内容。

我以为我正在接近以下内容,但意识到它没有返回分支名称,而是返回提交消息:

#!/bin/sh

# Get substr from "sha1[space]commit-msg"
BRANCH=$(git rev-list --pretty=oneline --branches --max-count=1 | awk '{split($0,array," ")} END{print array[2]}')
case $BRANCH in
    "experimental")
        dir="/home/APP_NAME/experimental"
    ;;
    "master")
        dir="/home/APP_NAME/production"
    ;;
esac
# move to location and copy files
git archive --format=tar HEAD | (cd $loc && tar xf -)

我确实意识到,如果我总是将分支作为提交的第一部分,我可以完成这样的事情,但我真的不想担心它。

任何帮助,将不胜感激。提前致谢!

4

2 回答 2

0

也许我遗漏了一些东西,但如果这是在一个post-update钩子中,那么你会得到正在更新的参考名称作为钩子的参数。例如,如果我的推送更新masterexperimental在存储库中,则post-update调用:

 post-update refs/heads/master refs/heads/experimental

...你可以$1$2往常一样在你的钩子脚本中访问它们。

顺便说一句,githooks文档指出您可能要考虑使用post-receive钩子,而不是获取有关标准输入的信息 - 但是,它还为您提供 ref 的旧值和新值以及 ref 名称,这可能是有用。

于 2011-03-20T18:24:10.970 回答
0

如果您推送到非裸仓库(这不是推荐的技术,但可以使用此更新后挂钩),您可以完成该挂钩,知道:

git symbolic-ref HEAD
# or
git rev-parse HEAD

给你当前分支的名字,while$ref代表被推送的分支。
然后,您可以更新三个不同的工作树,每个工作树都已设置在正确的分支上。

于 2011-03-20T00:17:18.577 回答