代码之家  ›  专栏  ›  技术社区  ›  Felixyz

Git:如何在推送到时进行远程目录更新?

  •  7
  • Felixyz  · 技术社区  · 15 年前

    我想使用git来管理远程服务器上的一些数据,所以我设置了一个 在那里。我可以毫无问题地推送它,存储库本身也会更新,但实际文件不会更改/添加/删除。我必须通过ssh连接到服务器并执行

    git reset --hard HEAD
    

    以获取要实际更新的文件结构。

    怎么办?

    4 回复  |  直到 9 年前
        1
  •  8
  •   Lee B    15 年前

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

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

    • 按照git文档设置裸存储库
    • 将代码从您的回购协议签出到您的实时服务目标目录
    • 设置一个git钩子(post-commit应该是正确的IIRC),以便在更新存储库时更新您的实时服务。它可能应该cd到live service目录,并执行git拉取--rebase,还可能设置一些文件权限。
    • 从现在起,只需将代码从开发盒推送到repo即可。
        2
  •  8
  •   Community VonC    7 年前

    令人高兴的是,现在git本身直接支持这一点!你可以在这个答案中找到详细信息,我刚刚投了更高的票:

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

    git config receive.denyCurrentBranch updateInstead
    

        3
  •  4
  •   Arkaitz Jimenez    15 年前

    使用更新后挂钩:

    hooks

    在那里,您可以在每次更新中执行任何您想要的操作。

        4
  •  1
  •   Danny Virasawmi    10 年前

    Git版本1.9.1

    LAMP服务器

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

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

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

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

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

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