如果将以下脚本作为hooks/post-receive
挂钩添加到裸git存储库foo.git
:
#!/bin/sh
GIT_WORK_TREE=/bar git checkout -f
然后每当有人推送到存储库时,当前状态将在目录bar
中更新。
这需要bar
和foo.git
在同一台计算机上。
修改它的最简单方法是什么,以便在远程计算机上进行结账(比如baz:/bar
)?
一种方法是:
#!/bin/sh
GIT_WORK_TREE=/tmp/bar git checkout -f
rsync ... /tmp/bar baz:/bar
有更好的方法吗?也许不需要中间临时目录? (如果不是传递给rsync的正确选项是什么,以致结果目录与直接签出是一致的?)
答案 0 :(得分:1)
GIT_WORK_TREE=/bar
表示bar
是git repo。
如果bar
是远程端的git仓库,则它可以从裸仓库bare_bar.git
(也在远程端)拉出,您可以将其推送到。
换句话说,你的post-receive
钩子会通过ssh推送到bare_bar repo,而那个裸仓的post-receive
钩子会触发实际仓库bar
的拉动:见“ Creating a git repository from a production folder”。
我更喜欢一种解决方案,让远程服务器不受任何.git dirs(甚至理想的git包本身)
在这种情况下,您当前的post-receive挂钩及其rsync
命令似乎是以递增方式将新数据复制到远程工作树的唯一方法。
git archive
每次都会归档所有内容。 git bundle
会在另一边需要git。