如何推送到具有从中提交的能力的另一个工作副本

时间:2014-09-11 17:43:58

标签: git

这是我想用GIT复制的行为:

我有3个开发人员和1个生产服务器。

生产服务器在/srv/proj1中有GIT仓库并且它在提交#10

开发人员将更改推送到/srv/proj1,我做git co master

我可以在/srv/proj1中提交我的更改。

开发人员可以从/srv/proj1/

中提取更改

但是我听说GIT不能这样做(它会产生奇怪的错误),我应该创建--bare repo,然后克隆它或结帐。但是我失去了提交可能的热修改的能力。

我做错了吗?有可能吗?

2 个答案:

答案 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'