2009-09-16 99 views
7

我想使用git来管理远程服务器上的一些数据,所以我在那里建立了一个非裸露的存储库。我可以毫无问题地推送它,并且存储库本身会更新,但实际文件不会被更改/添加/删除。我必须ssh进入服务器,并执行Git:如何在推送到远程目录时进行更新?

git reset --hard HEAD 

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

要做什么?

回答

7

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

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

  • 更好的安全性,如果你打算让服务器上的检出文件可以从网络服务器访问。

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

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

我建议以下步骤:

  • 按照从您的回购建立一个纯仓库
  • 退房码到您的Live服务的目标目录
  • 设置git的文档一个git钩子(post-commit应该是正确的一个IIRC)在存储库更新时更新您的实时服务。它应该可以cd到实时服务目录,并做一个git pull --rebase,并可能设置一些文件权限。
  • 从现在开始,只需将您的代码从开发箱中推送到回购站。
+0

非常有用的答案。谢谢! – Felixyz 2009-09-21 20:48:24

+0

但至少对于各种非生产设置,请参阅Brandon Rhodes的答案。 – Felixyz 2016-11-19 18:35:30

3

使用更新后钩:

hooks

在那里,你可以执行任何你想在每次更新。

+0

我的想法确切。 – 2009-09-16 16:06:57

+0

谢谢。我曾希望有一个简单的设置来实现这一点。但钩子看起来也很简单。 – Felixyz 2009-09-16 16:54:13

1

Git版本1.9.1
Ubuntu服务器14。04 LTS
LAMP服务器

设置我的LAMP服务器来更新我的Git回购我的工作目录,每当我的web开发一个推更改了服务器。我注意到日志会记录新的提交,但不会更新工作目录。对于每次更新,不要手动执行此操作(git checkout -f),可以在接收到推送后自动设置。

  1. 在“.git”目录中,进入“钩子”文件夹。接收来自远程客户端推后

    #/ bin/sh的

    #更新工作目录:

  2. 与此内容的“挂钩”文件夹中创建一个名为“后收到”文件!
    #这应该针对git工作目录。

    GIT_WORK_TREE = /无功/网络/ dev_site GIT中结帐-f

  3. 启用权限通过键入在 “挂钩” 文件夹 “使用chmod + X后接收” 来执行该文件。

当提交到Git仓库时,它将会更新工作目录。我的网站现在显示当我在浏览器中访问它时所做的更改。

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

+0

GIT_WORK_TREE行应该指向你的工作目录。 – 2015-01-28 00:02:43

+0

这是一个定期回购,而不是一个裸回购。裸露的回购没有工作目录。 – 2015-01-28 00:25:07

3

这令人高兴的是,现在直接支持Git的本身!你可以找到这个答案的细节,我刚才upvoted:

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

它建议远程与

git config receive.denyCurrentBranch updateInstead 

配置这样是推动导致更新的工作副本!

+1

太好了,谢谢!我非常感谢SO如何让我跟踪我曾经问过的事情。我认为接受答案中的许多要点仍然有效(也许并不是“检出代码的实时更改”),但对于许多情况下可能不是“生产使用”的情况,这非常有用。 – Felixyz 2016-11-19 18:34:45