昨天,我发布了一个关于如何从我的一台机器克隆Git存储库到另一台机器的问题,我如何从另一台机器“克隆Git”?

现在我可以成功地将Git存储库从源存储库(192.168.1.2)克隆到目标存储库(192.168.1.1)。

但是当我对文件进行编辑,git commit -a -m "test"和git push时,我在目的地(192.168.1.1)上得到了这个错误:

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

我正在使用两个不同版本的Git(远程上的1.7版本和本地机器上的1.5版本)。这是一个可能的原因吗?


当前回答

最好的方法是:

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

这将克隆存储库,但不会在…/remote中生成任何工作副本。如果查看远程,您将看到创建了一个名为currentrepo的目录。Git,这可能是你想要的。

然后从本地Git存储库中:

git remote add remoterepo ..../remote/currentrepo.git

进行更改后,您可以:

git push remoterepo master

其他回答

错误消息error: refused to update检出branch: refs/heads/master由远程存储库发出,这意味着您试图将代码推到远程非裸存储库,该存储库当前在工作目录中检出了不同的代码。避免此问题的最佳方法是只推送到裸存储库—裸存储库永远不会发生此问题。

您可以简单地将远程存储库转换为裸存储库(裸存储库中没有工作副本—文件夹只包含实际的存储库数据)。

在远程存储库文件夹中执行以下命令:

git config --bool core.bare true

然后删除该文件夹中除.git外的所有文件。然后你就可以执行git推送到远程存储库而不会出现任何错误。

好的,如果您想要一个普通的远程存储库,那么创建一个额外的分支并签出它。将其推入一个分支(未签出),并在从本地推入后将其与当前活动的一个分支合并。

例如,在远程服务器上:

git branch dev
git checkout dev

在本地设置中:

git push 

远程服务器:

git merge dev

我刚开始学习Git时也犯过同样的错误。其他一些答案显然不适合Git新手!

我要用一些非专业术语来表达我的意思。不管怎样,你有两个存储库,一个是你第一次做的原始的,另一个是你刚刚做的工作。

现在您在工作存储库中,正在使用主分支。但是您碰巧也在原始存储库中“登录”到同一个主分支。现在,由于您是在原始版本中“登录”的,Git担心您可能会搞砸,因为您可能正在使用原始版本并把事情搞砸。因此,您需要返回到原始存储库并执行git检出其他分支,现在您可以毫无问题地进行推送。

让我加上我的50美分,因为投票最多的答案https://stackoverflow.com/a/3251126/3455918建议将远程repw转换为裸库,如果这不是我想要的呢?

最后,我必须在远程机器上有相同的代码,但不只是.git边缘的某个地方的一团字节。

第二次投票(在撰写本文时)的解决方案https://stackoverflow.com/a/2933656/3455918可以完成这项工作,但在测试之后,我最终不得不不断地在远程机器上的分支之间切换,以“释放”我想从本地机器推送到的分支。

这招对我很管用:

到目前为止对我有效的另一个解决方案不是我的,功劳是给了一个对第一个解决方案发表评论的用户@kxr。

在远程机器上,您必须在repo目录中执行此命令。

git配置receive.denyCurrentBranch updateInstead

在此之后,您就完成了!

显然,这种解决方案可能有一些缺点,但对于将本地机器代码同步到远程回购的简单任务来说,它可能已经足够好了。

如果有人在评论中解释为什么在github上创建一个全新的repo,将你的本地文件夹链接到它,并开始做git push origin master而没有错误,我会很感激。

但是尝试在远程服务器上进行同样的回购会产生错误:

! [远程拒绝]master -> master(分支当前签出)

我发现一篇可能对其他人有用的文章是《Git 5分钟》。

我有一个在Git版本控制下的Xcode项目,我想把它推到DC中的虚拟分布式以太网(VDE)上。VDE运行Centos 5。

我读过的关于Git的文章中没有一篇谈到了裸库。这一切听起来都很简单,直到我尝试了我认为来自SVN背景的东西。

这里的建议使远程存储库裸露工作。更适合我的需求是克隆Xcode项目到projectname。Git,复制到远程服务器;然后,推神奇地起作用了。下一步将是让Xcode推送没有关于提交的错误,但现在我可以从终端做它。

So:

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git sshusername@remotehost.com:repos/<br/>

在Xcode中提交后,从Xcode项目中推送更改:

cd /xcode-project-directory<br/>
git push sshusername@remotehost.com:repos/projectname.git<br/>

我确信有一种更流畅更复杂的方法来完成上述工作,但至少这是可行的。为了让一切都清楚,这里有一些澄清: /xcode-project-directory是xcode项目的存放目录。可能是/Users/Your_Name/Documents/Project_Name。 Projectname字面上是项目的名称,但它可以是任何您愿意调用它的名称。少不更事的人不在乎,你会在乎的。

要使用scp,您需要在远程服务器上有一个允许SSH访问的用户帐户。任何运行自己服务器的人都会有这个。如果你正在使用共享主机或类似的东西,你可能就不走运了。

Remotehost.com是远程主机的名称。你可以使用它的IP地址。为了进一步清晰起见,我在远程主机上使用带有SSH密钥的giitosis,所以当我按下按钮时,不会提示输入密码。文章托管Git存储库,简单(和安全)的方式告诉你如何设置所有这些。