我有一个中央的,裸的,git的存储库,我们所有的开发人员都会推动它。这是我们的起源。我使用origin来推送到一个单独的非裸存储库并覆盖所有更改。这是一个示范区域,因此当有人推送到特定分支时,我们可以立即看到变化。
Origin将推送到演示存储库,但工作文件不会更改。我在原点上有一个post-receive hook,它叫:
git push -f ssh://git@<host>/<path> <branch name>
然后我在演示回购的后接收挂钩调用:
git fetch origin <branch name>
git reset --hard FETCH_HEAD
如果我在演示盒上调用这些命令,我的工作副本会更新。但是从post-receive(在demo repo上)调用它们会留下需要手动提交的更改。我想跳过手动更新工作副本的步骤。
我意识到,通过一些google-fu和stackoverflow搜索,推送到非裸存储库通常是不好的做法。我理解风险,但我希望这可以工作,因为我们使用裸存储库作为我们的起源。
git是否会进行某种额外检查以防止后期接收更新工作副本?有没有解决方法?
答案 0 :(得分:0)
有一种方法可以做到这一点,这也将解决您的问题:
将工作网站分为裸git仓库和工作目录,我们分别称他们为/repos/demo.git
和/sites/demo
像往常一样推送到您的演示仓库,那部分很好
在demo repo的post-receive挂钩中,使用以下命令更新工作目录
git --work-tree /sites/demo reset --hard branchname
其中branchname
是收到的分支的名称(您推送的分支)
这样你就不会违反良好做法:你的演示回购是裸露的,所以推动它是完全正常的。没有git fetch
步骤,这是不必要的,因为demo repo刚收到提交,没有什么可以获取。
--work-tree
当然是主要技巧。它使git命令在不同的地方操作一个目录,你也可以在裸存储库中使用它。在钩子里面,我认为裸git repo的目录是正确设置的。如果没有,您可以使用--git-dir
选项强制它:
git --git-dir /repos/demo.git --work-tree /sites/demo reset --hard branchname