2

如果您将以下脚本作为hooks/post-receive挂钩添加到裸 git 存储库foo.git

#!/bin/sh
GIT_WORK_TREE=/bar git checkout -f

然后每当有人推送到存储库时,当前状态将在目录中更新bar

这要求barfoo.git必须在同一台机器上。

修改它以便在远程机器上进行结帐的最简单方法是什么(比如说baz:/bar)?

一种方法是:

#!/bin/sh
GIT_WORK_TREE=/tmp/bar git checkout -f
rsync ... /tmp/bar baz:/bar

有没有更好的办法?也许不需要中间临时目录?(如果不是,传递给 rsync 以使生成的目录与直接签出相同的正确选项是什么?)

4

1 回答 1

1

GIT_WORK_TREE=/bar意味着这bar是一个 git repo。

如果bar是远程端的 git 存储库,那么它可以从裸存储库bare_bar.git(也在远程端)中提取,您可以推送到该存储库。

换句话说,您的post-receive钩子将通过 ssh 推送到 bare_bar 存储库,并且post-receive该裸存储库上的钩子将触发从实际存储库中的拉取bar:请参阅“从生产文件夹创建 git 存储库”。


我更喜欢使远程服务器不受任何 .git 目录(理想情况下甚至是 git 包本身)的解决方案

在这种情况下,您当前的 post-receive 钩子及其rsync命令似乎是将新数据增量复制到远程工作树的唯一方法。

于 2013-01-23T06:48:22.727 回答