【发布时间】:2010-11-28 20:45:45
【问题描述】:
我想用git来管理远程服务器上的一些数据,所以我在那里建立了一个non-bare存储库。我可以毫无问题地推送它,并且存储库本身会更新,但实际文件不会更改/添加/删除。我必须 ssh 进入服务器并执行一个
git reset --hard HEAD
让文件结构真正更新。
要做什么?
【问题讨论】:
标签: git version-control git-push
我想用git来管理远程服务器上的一些数据,所以我在那里建立了一个non-bare存储库。我可以毫无问题地推送它,并且存储库本身会更新,但实际文件不会更改/添加/删除。我必须 ssh 进入服务器并执行一个
git reset --hard HEAD
让文件结构真正更新。
要做什么?
【问题讨论】:
标签: git version-control git-push
你不应该这样做。建议使用裸存储库。换句话说,没有文件被检出,只有 .git 目录本身。然后,您可以将存储库签出到服务器上的其他位置——例如,您的 Web 根目录。这样,您将获得:
git 最佳实践。根据 Git 文档,如果你不遵循它,你会得到“意想不到的结果”。任何编程过的人都知道,“意外结果”是“可能会吃掉你的孩子,应该不惜一切代价避免”的代码。
更好的安全性,如果您打算从网络服务器访问服务器上的签出文件。
对签出代码的本地修改,以及对实时签出代码进行快速更改的能力。您可以尝试直接在存储库上执行此操作,但这会很混乱并且更容易出错。
独立于更新实时服务代码更新服务器存储库的能力。如果您正在远程工作并且需要向服务器发送一些内容,然后在它为您的实时服务做好准备之前进行进一步的工作,或者您的实时服务代码有更改(例如,不同的配置设置),这非常重要) 并且需要将这些更改与 repo 中的更改合并,但现在不能这样做。
我推荐以下步骤:
【讨论】:
很高兴,现在 git 本身直接支持这一点!您可以在此答案中找到详细信息,我刚刚对此表示赞同:
https://stackoverflow.com/a/38363683/85360
建议使用远程配置
git config receive.denyCurrentBranch updateInstead
这样推送会导致更新的工作副本!
【讨论】:
【讨论】:
Git 版本 1.9.1
Ubuntu 服务器 14.04 LTS
LAMP 服务器
每当我的一位 Web 开发人员将更改推送到服务器时,我将 LAMP 服务器设置为更新我的 Git 存储库的工作目录。我注意到日志会记录新的提交,但不会更新工作目录。无需为每次更新手动执行此操作 (git checkout -f),而是可以在收到推送后自动设置。
在“hooks”文件夹中创建一个名为“post-receive”的文件,其中包含以下内容:
#!/bin/sh
# 收到远程客户端推送后更新工作目录。
# 这应该指向 git 工作目录。
GIT_WORK_TREE=/var/www/dev_site git checkout -f
通过在“hooks”文件夹中键入“chmod +x post-receive”来启用执行文件的权限。
现在,当提交被推送到 Git 存储库时,它会更新工作目录。当我在浏览器中访问时,我的网站现在会显示更改。
我的工作目录是 /var/www/dev_site
【讨论】: