这是我想用GIT复制的行为:
我有3个开发人员和1个生产服务器。
生产服务器在/srv/proj1
中有GIT仓库并且它在提交#10
开发人员将更改推送到/srv/proj1
,我做git co master
。
我可以在/srv/proj1
中提交我的更改。
开发人员可以从/srv/proj1/
。
但是我听说GIT不能这样做(它会产生奇怪的错误),我应该创建--bare
repo,然后克隆它或结帐。但是我失去了提交可能的热修改的能力。
我做错了吗?有可能吗?
答案 0 :(得分:1)
我想看看你在哪里听到git不能这样做。 Git旨在分发,而不是托管。这意味着任何git存储库都可以充当远程。 “git服务器”存在的唯一原因是因为这是我们通常最习惯的模型。
你提出的建议应该没有错。 Git处理得很好。
当你“推”到遥控器时,它基本上与提交完全相同,因为推送只需要你的提交并将它们添加到遥控器。
然而,如果有人在你工作时推送代码,可能会发生奇怪的行为。
示例,开发人员推动更改。你结帐。你正在研究一些东西,现在开发人员再次推动。开发人员现在会收到一堆错误,因为分支已签出。在你提交并结账HEAD之前,他们不能再推(或拉)。 您可以通过创建一个新分支,进行更改,然后将更改合并回主服务器来解决此问题。
关于修补程序,您始终可以使用推送提交修补程序。您不必直接在服务器上工作。
答案 1 :(得分:1)
默认情况下,Git不允许任何人推送到当前已检出的回购分支 如果您在生产服务器上签出主要尝试进行热修复,并且开发人员正在尝试将更改推送到主控,那么他们将获得以下输出。有一些方法可以解决它,如错误输出中所述,但典型的做法是使用一个裸仓库进行生产,然后使用单独的仓库来提交/推送修补程序。
(master)$ git push
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 262 bytes | 0 bytes/s, 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 /scratch/r1
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '/scratch/r1'