首先,道歉,因为我是git,ssh和Xcode的新手。另外,我是一个相当强硬的命令行。
我们有一台服务器正在运行,客户端使用ssh身份验证pull / push代码连接到/。对于我使用git命令行设置的现有项目,它在Xcode 4中运行得非常好。使用Xcode 4和推送提交从那里克隆项目非常简单。
我感到困惑的是如何将我们的服务器设置为开发人员使用Xcode 4创建的本地git项目的源/主服务器(具有大量的签入历史记录)。我看到有一个隐藏的.git文件夹,所以我试过了:
scp -r .git git@my.server.com:MyProject.git
然后从Xcode 4开始,我可以完全从我们的服务器中克隆它。我可以看到完整的签到历史。如果我尝试推送更改,我会收到一条巨大的错误消息。
remote:错误:拒绝更新签出的分支:refs / heads / master
remote:错误:默认情况下,更新非裸存储库中的当前分支
remote:error:被拒绝,因为它会使索引和工作树不一致
remote:错误:你推了什么,并且需要'git reset --hard'来匹配
remote:错误:HEAD的工作树。
remote:错误:您可以将'receive.denyCurrentBranch'配置变量设置为
remote:错误:远程存储库中的'ignore'或'warn'允许进入
remote:错误:当前分支;但是,除非你是这样,否则不建议这样做
remote:错误:安排更新其工作树以匹配您在某些中推送的内容
远程:错误:其他方式。
远程:错误:
remote:error:要压制此消息并仍保持默认行为,请设置
remote:错误:'receive.denyCurrentBranch'配置变量为'拒绝'。
[剪断]
我不知道如何正确地做到这一点而不会失去开发人员在本地机器上已经拥有的宝贵的签到历史。
有人可以指出我缺少的基本步骤或概念吗?
谢谢!
答案 0 :(得分:9)
如果你想push
到一个回购,默认情况下它被禁止push
到当前签出的分支。
为了避免这种情况,中央回购(每个人都推送的那些)通常被创建为bare
回购,即它们仅包含版本信息而没有检出的工作副本。这些回购按惯例命名为<repo-name>.git
。您可以使用git init
--bare
标记创建一个裸仓库
git init --bare myrepo.git
但问题是您将本地.git
文件夹复制到my.server.com
而不是在那里创建一个裸仓库。在.git/config
中,有关于回购是否裸露的信息。在工作副本中,bare
为false,此信息现在位于服务器上。
解决这个问题的正确方法是
remote
git remote
add origin git@my.server.com:MyProject.git
origin
git push
--force --all origin