推送到非原始的非裸git存储库

时间:2014-03-05 22:32:57

标签: git repository staging demo

我有一个中央的,裸的,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是否会进行某种额外检查以防止后期接收更新工作副本?有没有解决方法?

1 个答案:

答案 0 :(得分:0)

有一种方法可以做到这一点,这也将解决您的问题:

  1. 将工作网站分为裸git仓库和工作目录,我们分别称他们为/repos/demo.git/sites/demo

  2. 像往常一样推送到您的演示仓库,那部分很好

  3. 在demo repo的post-receive挂钩中,使用以下命令更新工作目录

    git --work-tree /sites/demo reset --hard branchname
    

    其中branchname是收到的分支的名称(您推送的分支)

  4. 这样你就不会违反良好做法:你的演示回购是裸露的,所以推动它是完全正常的。没有git fetch步骤,这是不必要的,因为demo repo刚收到提交,没有什么可以获取。

    --work-tree当然是主要技巧。它使git命令在不同的地方操作一个目录,你也可以在裸存储库中使用它。在钩子里面,我认为裸git repo的目录是正确设置的。如果没有,您可以使用--git-dir选项强制它:

    git --git-dir /repos/demo.git --work-tree /sites/demo reset --hard branchname