Git:如何在推送时使远程目录更新?

9
我想使用git来管理远程服务器上的一些数据,因此我在那里设置了一个非裸仓库。我可以顺利地将代码推送到服务器,更新了仓库,但实际的文件并没有被更改/添加/删除。我必须通过ssh登录到服务器并执行
git reset --hard HEAD

如何使文件结构实际更新?

需要做什么?

4个回答

12

很高兴的是,现在git直接支持此功能!您可以在我刚刚点赞的这个答案中找到详细信息:

https://dev59.com/mGw05IYBdhLWcg3wmCwo#38363683

它建议使用以下命令配置远程:

git config receive.denyCurrentBranch updateInstead

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


2
太好了,谢谢!我真的很感激 Stack Overflow 让我能够追踪我曾经忘记过的问题。我认为被接受的答案中的许多观点仍然有效(也许不是那么关于“检出代码上的实时更改”),但对于许多可能不是“生产使用”的情况来说,这真的非常有用。 - Felixyz

9
您不应该这样做。推荐使用裸仓库,也就是没有文件被检出,只有.git目录本身。然后您可以将仓库检出到服务器上的其他位置,比如您的网站根目录。这样做的好处有:
  • git最佳实践。根据Git文档,如果不遵循它,可能会得到“意外结果”。任何有一定编程经验的人都知道,“意外结果”意味着“可能会吞噬你的孩子,应该尽量避免。”

  • 更好的安全性,如果您计划从Web服务器访问服务器上检出的文件。

  • 在您检出的代码上进行本地修改,并能够快速更改现场检出的代码。您可以尝试直接在仓库上进行此操作,但会比较混乱且容易出错。

  • 独立更新服务器仓库的能力,而无需更新您的现场服务代码。如果您远程工作并需要将某些内容发送到服务器,然后进行进一步的工作,以使其准备好用于现场服务,或者如果您的现场服务代码发生更改(例如,不同的配置设置),并需要将这些更改与仓库中的更改合并,但现在还不能这样做,这一点非常重要。

我建议按照以下步骤进行操作:
  • 遵循Git文档设置裸仓库
  • 将代码从您的仓库检出到现场服务目标目录
  • 设置一个Git hook(如果我没记错的话,post-commit应该是正确的)以在更新仓库时更新您的现场服务。它应该进入现场服务目录,并执行git pull --rebase,可能还需要设置一些文件权限。
  • 从现在开始,只需从开发计算机推送代码到仓库即可。

但至少对于各种非生产设置,可以参考Brandon Rhodes的回答。 - Felixyz

4

使用 post-update 钩子:

钩子

在那里,您可以在每次更新时执行任何操作。


谢谢。我本来希望有一个简单的设置可以完成这个任务,但是钩子似乎也很简单。 - Felixyz

1

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

我将我的LAMP服务器设置为在Web开发人员推送更改到服务器时更新Git repo的工作目录。我注意到日志会记录新的提交,但不会更新工作目录。为了避免每次更新都手动执行(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 repo时,它将自动更新工作目录。当我在浏览器中访问网站时,网站已经显示了更改。

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


GIT_WORK_TREE这一行应该指向你的工作目录。 - Danny Virasawmi
这是针对常规 Repo 的,而不是裸 Repo。裸 Repo 没有工作目录。 - Danny Virasawmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接