2

我收到“[remote denied] master branch is current check out”错误——与这篇文章中的 OP 基本上是相同的问题(Git push error '[remote denied] master -> master (branch is current check out)') ,以下是我迄今为止为修复它所做的工作,但现在我似乎可以在上述问题或新问题之间做出选择 - “缺少工作树”错误,如下所述,这是我目前陷入困境的地方。

另请注意,我的要求与其他问题不同。我不想要两个仓库,一个是裸的,一个是非裸的——只是一个仓库(源/远程),本地机器将从中提取/推送代码——它是一个实时 Web 服务器。另一篇文章没有按照这些要求指定任何要求(那里没有解决这个选项),但我的需求非常具体,因此提出了这个问题。

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

首先,我重置了 repo,将其设置为 bare(最初在服务器上设置 Git 的开发人员只git init在设置 repo 时使用了该命令):

    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: 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 Git 中 HEAD / Working Tree / Index 之间的区别 The Pro-Git book (尤其是这里:http ://git-scm.com/book/ch2-2.html) Git-Flow(nvie):http ://nvie.com/posts/a-successful-git-branching-model/

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

4

1 回答 1

3

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

根据您的问题,我了解到您有某种服务器设置,并且每次您执行 agit push时,您都希望更新服务器上的文件以反映新推送的更改。

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

以下是此设置的步骤:

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

    mkdir -p /foo/bar
    
  2. 创建以下脚本并将其作为裸仓库复制hooks/post-receive

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

    chmod +x hooks/post-receive
    

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

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

另外,我建议摆脱您在 中所做的更改.git/config,尤其是对receive.denyCurrentBranch.

您的配置应如下所示:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    logallrefupdates = true
于 2013-03-27T19:17:29.937 回答