我想为网站配置一个 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