【问题标题】:Git: how to make remote directory update when pushed to?Git:推送到时如何进行远程目录更新?
【发布时间】:2010-11-28 20:45:45
【问题描述】:

我想用git来管理远程服务器上的一些数据,所以我在那里建立了一个non-bare存储库。我可以毫无问题地推送它,并且存储库本身会更新,但实际文件不会更改/添加/删除。我必须 ssh 进入服务器并执行一个

git reset --hard HEAD

让文件结构真正更新。

要做什么?

【问题讨论】:

    标签: git version-control git-push


    【解决方案1】:

    你不应该这样做。建议使用裸存储库。换句话说,没有文件被检出,只有 .git 目录本身。然后,您可以将存储库签出到服务器上的其他位置——例如,您的 Web 根目录。这样,您将获得:

    • git 最佳实践。根据 Git 文档,如果你不遵循它,你会得到“意想不到的结果”。任何编程过的人都知道,“意外结果”是“可能会吃掉你的孩子,应该不惜一切代价避免”的代码。

    • 更好的安全性,如果您打算从网络服务器访问服务器上的签出文件。

    • 对签出代码的本地修改,以及对实时签出代码进行快速更改的能力。您可以尝试直接在存储库上执行此操作,但这会很混乱并且更容易出错。

    • 独立于更新实时服务代码更新服务器存储库的能力。如果您正在远程工作并且需要向服务器发送一些内容,然后在它为您的实时服务做好准备之前进行进一步的工作,或者您的实时服务代码有更改(例如,不同的配置设置),这非常重要) 并且需要将这些更改与 repo 中的更改合并,但现在不能这样做。

    我推荐以下步骤:

    • 按照 git 文档设置裸存储库
    • 将代码从您的存储库签出到您的实时服务目标目录
    • 设置一个 git 挂钩(提交后应该是正确的 IIRC)以在更新存储库时更新您的实时服务。它可能应该 cd 到实时服务目录,并执行 git pull --rebase,并可能设置一些文件权限。
    • 从现在开始,只需将您的代码从您的开发箱推送到存储库即可。

    【讨论】:

    • 但至少对于各种非生产设置,请参阅 Brandon Rhodes 的回答。
    【解决方案2】:

    很高兴,现在 git 本身直接支持这一点!您可以在此答案中找到详细信息,我刚刚对此表示赞同:

    https://stackoverflow.com/a/38363683/85360

    建议使用远程配置

    git config receive.denyCurrentBranch updateInstead
    

    这样推送会导致更新的工作副本!

    【讨论】:

    • 太好了,谢谢!我真的很感激 SO 如何让我跟踪我曾经问过的那些我忘记的东西。我认为已接受答案中的许多观点仍然有效(也许不是“签出代码的实时更改”),但对于许多可能不是“生产使用”的情况,这真的很有用。
    【解决方案3】:

    使用更新后挂钩:

    hooks

    您可以在每次更新时执行任何您想要的操作。

    【讨论】:

    • 谢谢。我曾希望有一个简单的设置来完成这个。但是钩子看起来也很简单。
    【解决方案4】:

    Git 版本 1.9.1
    Ubuntu 服务器 14.04 LTS
    LAMP 服务器

    每当我的一位 Web 开发人员将更改推送到服务器时,我将 LAMP 服务器设置为更新我的 Git 存储库的工作目录。我注意到日志会记录新的提交,但不会更新工作目录。无需为每次更新手动执行此操作 (git checkout -f),而是可以在收到推送后自动设置。

    1. 在“.git”目录中,进入“hooks”文件夹。
    2. 在“hooks”文件夹中创建一个名为“post-receive”的文件,其中包含以下内容:

      #!/bin/sh

      # 收到远程客户端推送后更新工作目录。
      # 这应该指向 git 工作目录。

      GIT_WORK_TREE=/var/www/dev_site git checkout -f

    3. 通过在“hooks”文件夹中键入“chmod +x post-receive”来启用执行文件的权限。

    现在,当提交被推送到 Git 存储库时,它会更新工作目录。当我在浏览器中访问时,我的网站现在会显示更改。

    我的工作目录是 /var/www/dev_site

    【讨论】:

    • GIT_WORK_TREE 行应该指向您的工作目录。
    • 这是一个常规的回购,而不是一个简单的回购。裸 Repo 没有工作目录。
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 2017-02-25
    • 1970-01-01
    • 2016-10-07
    • 2011-12-23
    • 2014-01-13
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多