git 缺少工作树

标签 git workflow

我收到“[远程拒绝]主分支当前已 checkout ”错误 - 本质上与这篇文章中的OP ( Git push error '[remote rejected] master -> master (branch is currently checked out)' ) 相同的问题,以下是我迄今为止所做的修复工作,但现在看来我可以在上述问题或新问题之间做出选择 - “缺少工作树”错误,如下所述,这就是我目前陷入困境的地方。

另请注意,我的要求与其他问题不同。我不想要两个存储库,一个是裸露的,一个是非裸露的 - 只是单个存储库(源/远程),本地计算机将从其中 pull/推代码 - 并且它是一个实时 Web 服务器。另一篇文章没有明确说明任何要求(并且该选项没有在那里解决),但我的需求非常具体,因此提出了这个问题。

另请注意,有时可能会在服务器上直接编辑此目录的文件(尽管仍然使用 Git),而不是从本地工作站推送到服务器(远程),这是不可避免的。

首先,我重置了存储库,将其设置为裸(最初在服务器上设置 Git 的开发人员在设置存储库时仅使用了 git init 命令):

    git init --bare    

然后,因为我的所有服务器文件都已经存在(它不是一个空目录),所以我通过这种方法(通常)进行了初始提交:

    git add .
    git commit -m "initial commit"

然后我这样编辑了 .git/config 文件:

    git config receive.denyCurrentBranch ignore    

我当前的服务器 .git/config 文件如下所示:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true

[receive]
        denyCurrentBranch = false

我能够成功推送提交,但是如果我尝试应用此:

    git checkout -f

按照上面的建议(大概是接受所有提交并重置 HEAD 以包含我的所有更改?),我收到以下 fatal error :

    fatal: This operation must be run in a work tree

我需要将工作树设置到这个目录吗?如果是这样,我该怎么做?如果我这样做,结果是否仍然符合我既定的目标(同样,没有单独的裸露和非裸露存储库 - 只是单个目录,它还为实时网站提供服务并且位于网络根目录中) ?

还有什么我需要做而我遗漏的吗?

我在 stackoverflow 上广泛阅读了有关此主题的内容,包括: Git init --bare - Not Working on working tree fatal: This operation must be run in a work tree Difference between HEAD / Working Tree / Index in Git Pro-Git 书(尤其是: http://git-scm.com/book/ch2-2.html ) Git-Flow (nvie):http://nvie.com/posts/a-successful-git-branching-model/

非常感谢所有帮助和评论。谢谢!

最佳答案

您已经创建了一个裸 git 存储库(它本身没有工作树)。当您想要推送更改时,推荐使用裸 git 存储库。

从你的问题中,我了解到你有某种服务器设置,每次你执行git推送时,你都希望更新服务器上的文件以反射(reflect)新推送的更改.

是的,这是可行的,但是您需要将裸存储库和工作树分开。工作树位置应与需要在服务器上部署文件的位置相对应。我们假设它是 /foor/bar。通过设置接收后 Hook ,您可以在每次推送后自动将新文件部署到此工作树位置。

以下是此设置的步骤:

  1. 如果工作树目录尚不存在,则创建它。

    mkdir -p /foo/bar
    
  2. 创建以下脚本并将其复制为 bare-repo 的 hooks/post-receive

    #! /bin/sh
    GIT_WORK_TREE=/foo/bar git checkout -f
    
  3. 将此脚本标记为可执行:

    chmod +x hooks/post-receive
    

这就是所需要的全部。现在尝试 git Push,您的新更改将自动部署到 /foo/bar 位置。

注意事项: git checkout -f 会破坏任何跟踪文件中的所有本地更改以及 /foo/bar 中的任何此类更改code> 将在新的 checkout -f 上丢失。任何未在 git 中跟踪但在 /foo/bar 下创建/生成的文件不应受到影响。

此外,我建议删除您在 .git/config 中所做的更改,尤其是 receive.denyCurrentBranch

你的配置在我看来应该是这样的:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    logallrefupdates = true

关于git 缺少工作树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15666667/

相关文章:

git - 如何维护受 git 源代码控制的 bash 脚本的版本号?

visual-studio - Sharepoint 工作流程开发(2 部分问题)

debugging - 如何: debug Scala code when outside of an IDE

python - 了解 apache Airflow 中的 TreeView

发布后,SharePoint Designer工作流不会更改

安装 Git 后 Git GUI 和 gitk 不存在

git - Jenkins 无法访问 Azure Ubuntu VM 上的 Git 存储库

git - Vim:在 vimrc 中有条件地使用 fugitive#statusline 函数

node.js - 在 Windows 机器上工作时使用 unix 行结尾有什么副作用吗?

debugging - 用于调试目的的 WSO2 工作流执行跟踪