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

时间:2009-09-16 15:56:01

标签: git version-control git-push

我想使用git管理远程服务器上的某些数据,因此我在那里设置了一个非裸存储库。我可以毫无问题地推送它,并且存储库本身会更新,但实际文件不会被更改/添加/删除。我必须ssh到服务器并做一个

git reset --hard HEAD

让文件结构实际更新。

要做什么?

4 个答案:

答案 0 :(得分:7)

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

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

  • 如果您计划通过网络服务器访问服务器上的签出文件,则可以提高安全性。

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

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

我建议采取以下步骤:

  • 关注设置裸存储库的git文档
  • 查看您的回购中的代码到您的实时服务目标目录
  • 在更新存储库时,设置一个git hook(post-commit应该是正确的IIRC)来更新您的实时服务。它可能应该cd到实时服务目录,并执行git pull --rebase,并可能设置一些文件权限。
  • 从现在开始,只需将代码从开发框推送到repo。

答案 1 :(得分:5)

很高兴,现在可以直接在git中支持了!你可以在这个答案中找到我刚刚赞成的详细信息:

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

建议使用

配置遥控器
git config receive.denyCurrentBranch updateInstead

这样推送会产生更新的工作副本!

答案 2 :(得分:3)

使用更新后的挂钩:

hooks

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

答案 3 :(得分:1)

Git Version 1.9.1
Ubuntu Server 14.04 LTS
LAMP服务器

每当我的一个Web开发人员将更改推送到服务器时,我将LAMP服务器设置为更新我的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”来启用执行文件的权限。

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

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