【问题标题】:post_receive hook in git: how does it checkouts my non-git folder?git 中的 post_receive 钩子:它如何检查我的非 git 文件夹?
【发布时间】:2023-03-06 04:53:01
【问题描述】:

我将webfaction 用作我的web deployment

我有一个 Django 应用程序位于:webapps/django_app/project_name/

我有一个 Git 存储库:webapps/git_app/repos/my_repo.git

my_repo.git 是一个裸仓库。它不是工作目录。

每当我从本地开发计算机推送到远程(webfaction --> my_repo.git)时,我都希望我的 django_app 获取推送的代码。

我关注了这个post,效果很好。但没有给出它是如何工作的解释。

我在 my_repo.git 的 post_recieve 钩子中添加了这两行。

#!/bin/sh
GIT_WORK_TREE=/home/username/webapps/django/myproject git checkout -f 
GIT_WORK_TREE=/home/username/webapps/django/myproject git reset --hard

这两行实际上是做什么的?

此外,我的 Djangoapp 文件夹不是 git repo。仍然每当推送到 my_repo.git 时,Djangoapp 都会更新。那么它是如何工作的呢?

【问题讨论】:

    标签: django git webfaction git-post-receive git-reset


    【解决方案1】:

    当您使用 .git 在本地管理文件时,您通常有两件事:

    • 您的 git 存储库,包含在 .git 目录中,并且
    • 您的工作树,即您实际编辑的文件集。

    默认情况下,存储库是工作树的子目录,但这不是必需的。设置 GIT_WORK_TREE 环境变量会指示 git 为您的签出文件使用不同的位置。

    所以第一行...

    GIT_WORK_TREE=/home/username/webapps/django/myproject git checkout -f 
    

    ...正在要求 git 将存储库的 HEAD 签出到 /home/username/webapps/django/myproject

    第二行……

    GIT_WORK_TREE=/home/username/webapps/django/myproject git reset --hard
    

    ...确保/home/username/webapps/django/myproject 没有任何本地更改。 reset --hard 丢弃对 git 跟踪的文件的任何更改。 “本地更改”是指您或其他人对该目录中的文件所做的任何更改;理想情况下,不会有,但如果有的话,reset -f 会确保修改后的文件被存储在存储库中的文件版本覆盖。

    有关此处列出的任何命令的更多详细信息,请尝试运行 git <command> --help 以获得手册页,或查看 The Git Book

    【讨论】:

    • 谢谢。 /home/username/webapps/django/myproject 不是 git 仓库。它只是一个目录。我还可以结帐吗?其次。我尝试谷歌查找 checkout -f 是什么意思?但没有找到好的答案。究竟是什么?为什么后面没有分支名称,即 git checkout -f master?
    • 你说 makes sure that /home/username/webapps/django/myproject does not have any local changes. ,任何本地更改可以来自哪里?重置到底是做什么的?一些例子?非常感谢
    • 要了解checkout -f 的含义,请尝试git checkout --help
    • 我已经更新了答案,希望能解决您的其他问题。
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2014-05-06
    • 2013-10-16
    相关资源
    最近更新 更多