针对特定裸仓库的gitolite后接收钩子

8

当我将本地的git仓库推送到服务器时:

$ git push origin master

我希望服务器上的裸库(在我推送后)能够:

$ cd /Users/me/Sites
$ git pull
$ exit

我看了这里的一些问题,它们提到了$HOME/gitolite/hooks中的钩子,

但是这是我正在使用的内容:

git@mm:gitolite $ pwd
/Users/git/gitolite
git@mm:gitolite $ ls
.git/                 README.txt            install*
CHANGELOG             check-g2-compat*      src/
COPYING               convert-gitosis-conf* t/

如何为特定的裸库添加后接收钩子?

如果我进入我的裸库:

git@mm:bare-repo.git $ ls hooks
applypatch-msg.sample*     pre-rebase.sample*
commit-msg.sample*         prepare-commit-msg.sample*
post-update.sample*        update@
pre-applypatch.sample*     update.sample*
pre-commit.sample*

我没有看到post-receive hook。这是怎么回事?

2个回答

7

更新于2013年8月,使用最新的gitolite: 您现在可以使用官方特定仓库钩子

它基本上只是在<repo.git>/hooks中创建一个符号链接,指向$rc{LOCAL_CODE}/hooks/repo-specific内部的某个文件(除了gitolite-admin仓库)


原始答案(

首先,如果您正在使用gitolite V3,您可以定义任何钩子,包括post-receive钩子(除了update钩子,请参见使用钩子):以前,使用gitolite V2pre-receive钩子是保留的。

现在,您可以通过将其复制到gitolite-admin/common/hooks本地克隆目录中,并将gitolite-admin推回gitolite服务器来添加钩子:gitolite将确保该钩子被声明为其管理的所有裸仓库。

你还可以直接在服务器上添加钩子,放置在$LOCAL_CODE变量指定的单独位置上("rc"在gitolite.rc配置文件中定义):$LOCAL_CODE/hooks/common。请参阅"自定义gitolite"。这样可以确保gitolite升级不会删除任何自定义程序。

只需定义一个可执行的“post-receive”文件(chmod 755),并将其复制到您选择的common/hooks目录中(gitolite-admin本地仓库加上git push,或者服务器上的.gitolite,或者服务器上的$LOCAL_CODE)。
注意: 您看不到“post-receive.sample”文件并不会阻止您定义该挂钩。
如果直接在服务器上操作,则需要运行gitolite setup --hooks-only以便在所有裸仓库上设置您的自定义挂钩。

您绝不能直接将其复制到您的bare-repo.git/hooks目录中: 这是gitolite发布“常规”挂钩到所有裸仓库的工作。
这样,您可以通过任何gitolite-admin仓库的克隆来直接管理它们(将该仓库推回将更新您可能已更改的任何挂钩)。

"

“所有裸仓库”意味着您的post-receive钩子必须知道它操作的裸仓库是哪一个:
您可以通过检查$GIT_DIR的值(设置为此钩子正在运行的裸仓库的根.git目录)来实现。

最后,对于这种类型的post-receive钩子,请参阅“post-receive钩子中进行Git checkout:“Not a git repository '.'””:
您需要明确定义GIT_DIRGIT_WORK_TREE到目标仓库,以便您的git pull成功。

"
 GIT_WORK_TREE=/Users/me/Sites GIT_DIR=/Users/me/Sites/.git git pull

1
我尝试使用以下步骤设置特定于仓库的钩子(v3):1 在rc中创建了LOCAL_CODE => "$ENV{HOME}/.gitolite/local"2'repo-specific-hooks'添加到rc中的ENABLE数组中, 3 在我的gitolite-admin中创建了目录local/hooks/repo-specific/,并提交和推送了它 4testing仓库在conf/gitolite.conf中添加字符串:option hook.post-receive = deploy,在conf文件中创建了文件local/hooks/repo-specific/deploy,并将其权限设置为0755,然后提交和推送它们... 5 我对testing仓库进行了提交/推送,但钩子没有触发,我做错了什么? - zb'
符号链接也不在这里,尝试运行 gitolite setup --hooks-only 但没有成功。 - zb'
@eicto,我已经编辑了答案,并附上了gitolite中特定于仓库的钩子的链接:请确保您拥有最新的gitolite。 - VonC
我不明白,如何在这里的命令行中放置\t:gitolite git-config gitolite-options.hook=reponame hookname scriptname 我已经多次阅读文档,但仍然不明白为什么它会忽略所有配置。您能否提供任何非抽象的配置示例,当我们有git控制的钩子目录(本地),并且简单的特定于存储库的钩子在post-receive上说“Hello world”? gitolite版本3.5.2 - zb'
1
@eicto 3.5.2版本过旧,不包含特定于仓库的钩子。您需要克隆https://github.com/sitaramc/gitolite并更新当前的gitolite安装。 - VonC
@eicto 安装或更新非常简单:http://stackoverflow.com/a/18503812/6309 - VonC

0
获取特定于仓库的提交后钩子(gitolite v3.6及以上版本):
  1. 编辑 gitolite.rc 文件,将 'repo-specific-hooks' 这一行的注释去掉(默认情况下应该是被注释掉的)。

  2. 运行 gitolite setup 命令。它会抱怨缺少一个目录路径。请创建它:mkdir -p /git/local/hooks/repo-specific

  3. 将您的 post-receive 钩子添加到该目录中:

    cd /git/local/hooks/repo-specific

    echo "stuff to do" > post-receive

    chmod o+x post-receive

  4. gitolite-admin/conf/gitolite.conf 中的所需仓库中添加 post-receive 钩子:

    repo fooBar

    option hook.post-receive = post-receive

  5. 重新运行 gitolite setup 命令。此时不应出现任何错误信息。

  6. foorBar 提交一些内容并观察魔法发生。

如果您想调试为什么它无法工作,请查看 ~/.gitolite/logs。另外请检查您的版本是否高于3.6。
如果您希望在 gitolite 控制之下的任何 repo 上发生 post-receive 操作,并且您不关心具体是哪一个,请将您的post-receive脚本添加到~/.gitolite/hooks/common中即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接