6

可能重复:
git push 错误'[remote denied] master -> master(分支当前已签出)'

我试图将我的存储库推送到“原点”,但是当我运行“git push”时出现此错误

Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 485 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
Auto packing the repository for optimum performance.
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
/usr/local/git/libexec/git-core/git-sh-setup: Zeile 235: uname: Kommando nicht gefunden.
warning: There are too many unreachable loose objects; run 'git prune' to remove them.
To ssh://XXXX@XXXXXX.typo3server.info/html/typo3
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://XXXXXXX@XXXXXX.typo3server.info/html/typo3'

怎么了?

4

1 回答 1

18

您正在尝试推送到非裸仓库(即带有工作树的仓库,就像您的本地克隆一样),但在另一端没有做任何事情来特别说明这一点。

您看起来像是在尝试git push部署您的站点。以下是如何做到这一点:

  1. 通过在服务器上的 repo 中运行它来忽略 git 现在给你的错误消息:

    git config receive.denyCurrentBranch ignore
    

    这告诉 git “我会解决的,相信我。”

    现在,如果您推送,它将更新 repo,但索引和工作副本将保持不变。这意味着它总是看起来像您已经进行了更改以恢复您推送的所有内容。

    我们需要一种在推送发生时更新索引和工作副本的方法。听起来是时候……</p>

  2. 设置一个post-receive钩子。.git/hooks/post-receive服务器的存储库中添加文件:

    #!/bin/bash
    
    # Drop the env var given to post-receive by default, as it'll mess up our
    # attempts to use git "normally."
    export -n GIT_DIR
    
    # Move back to the base of the working tree.
    cd ..
    
    # *Drop all changes* to index and working tree.
    git reset --hard
    

    请注意,这假设您只希望您的跟踪更改是实时的——<strong>您在实时站点上直接更改的任何内容都会在您下次推送时消失(未跟踪的文件除外,但您也不应该拥有这些文件)。

我在最后添加了一个git status,这样我就可以看到推送后的情况(因为它被传输回客户端)——这特别是我可以捕获未跟踪的文件并将它们添加到.gitignore,或跟踪它们。

不要忘记标记post-receive为可执行!


旁白:为什么你不应该有未跟踪的文件?

  1. 回滚能力:这是用于部署实时站点。如果您希望能够真正回滚失败的部署,那么您需要所有的东西一起进行部署。

    这绝对包括核心 CMS。现在,它只在服务器上,并且没有被跟踪,所以你没有希望检测到错误。

  2. 重新部署的能力:如果您的服务器的硬盘出现故障,您可以解压缩核心 CMS,再次将您的 git 存储库分层,并希望它能正常工作。

  3. 能够注意到意外未跟踪的内容:如果您有几十个未跟踪的文件,并且它们都“注定”不被跟踪,那么新文件很容易潜入并迷失在噪音中。

    如果您的默认情况下git status干净的,那么您会在它们弹出时立即注意到意外的未跟踪文件。

于 2012-07-09T13:23:01.570 回答