如何设置 git repo 以便推送,因为当前远程拒绝它?

如何设置 git repo 以便推送,因为当前远程拒绝它?

我想为网站配置一个 GIT 存储库。多个用户将在他们的本地机器上克隆存储库,并在每天结束时将他们的工作推送到服务器。我可以设置一个裸存储库,但我想要一个可用的目录/非裸存储库。

这个想法是,存储库的工作目录将成为网站的根文件夹。每天结束时,所有更改都将直接可见。但我找不到这样做的方法。

git init当客户端尝试推送某些文件时,使用初始化服务器 repo会出现以下错误:

git push origin master
[email protected]'s password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes, done.
Total 3 (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
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'.
To ssh://[email protected]/home/orangetux/www/
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://[email protected]/home/orangetux/www/'

所以我想知道这是否是为网站设置 GIT 存储库的正确方法?如果是,我该怎么做?如果不是,为网站开发设置 GIT 存储库的更好方法是什么?

我见过你不能推送到非裸仓库,但它如何解决我的问题?在服务器上创建一个裸存储库,并在同一台服务器上的 htdocs 文件夹中克隆此存储库?这对我来说看起来有点笨拙。要查看提交的结果,我每次都必须克隆存储库。

答案1

为了查看提交的结果,我每次都必须克隆存储库。

你不需要重新克隆,只需git pull最新变化每一次。

要自动执行此操作,您只需将正确的命令添加到<barerepo>/hooks/post-update裸存储库中的钩子中。

  • 方法 A,网站是主存储库的完整克隆:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                (unset GIT_DIR && cd "$dir" && git pull --quiet --ff-only)
            fi
        done
    fi
    

    提示:如果两个存储库都在同一台机器上,则可以git clone --shared /path/to/bare通过重用裸存储库的对象目录来节省空间。

    注意:方法 A 可能存在安全问题——.git如果您不将其移动到另一个位置,外部人员就可能下载包含您网站源代码的目录。

  • 方法B,网站仅有结账:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                # Must give a path (such as ".") to avoid switching HEAD.
                git --work-tree="$dir" checkout -f "$ref" -- .
            fi
        done
    fi
    

对于这两个钩子,git config hooks.checkoutTo /var/www在裸存储库内运行(或<barerepo>/config手动编辑文件)来设置目标路径。

master这两个钩子都只在分支更新时激活。

确保钩子文件是可执行的(chmod +x)。请参阅githooks(5)了解详情。


注意:从技术上讲,您推送到非裸存储库 – Git 将直接拒绝推送到当前签出的分支(推送到其他分支是可以的)。甚至可以禁用此检查,但这只会招惹麻烦……将裸存储库保存在单个目录中(例如~/srv/git~/Public/Git)也更干净,也更有利于备份。

答案2

[远程拒绝] 主服务器 -> 主服务器

它被远程拒绝,因此请通过再次拉取并推送来确保您所推送的存储库是最新的:

git pull; git push

如果仍然被拒绝,请先尝试推送到不同的分支:

git push origin master:foo

因此 repo 所有者可以合并你的分支。

如果您通过 对提交做了一些更改rebase,那么您可能希望通过 强制执行它-f

denyCurrentBranch或者通过以下方式远程禁用(不推荐):

git config receive.denyCurrentBranch ignore

相关内容