首先,抱歉,我是 git、ssh 和 Xcode 的新手。另外,我相当讨厌命令行。
我们有一个运行的服务器,客户端通过 ssh 身份验证从/向其中 pull/推送代码进行连接。对于我使用 git 命令行设置的现有项目,它可以从 Xcode 4 完美运行。使用 Xcode 4 从那里克隆项目并推送提交非常简单。
我感到困惑的是如何将我们的服务器设置为开发人员使用 Xcode 4(具有大量 checkin 历史记录)创建的本地 git 项目的源/主机。我看到有一个 stash 的 .git 文件夹,所以我尝试了:
scp -r .git git@my.server.com:MyProject.git
然后从 Xcode 4 开始,我可以继续从我们的服务器完美地克隆它。我可以看到完整的 checkin 历史记录。但是,如果我尝试推送更改,则会收到一条巨大的错误消息。
远程:错误:拒绝更新 checkout 分支:refs/heads/master
远程:错误:默认情况下,更新非裸存储库中的当前分支
remote: error: is denied,因为它会使索引和工作树不一致
远程:错误:与您推送的内容一致,需要“git reset --hard”才能匹配
远程:错误:工作树到 HEAD。
远程:错误:您可以将“receive.denyCurrentBranch”配置变量设置为
远程:错误:远程存储库中的“忽略”或“警告”以允许推送到
远程:错误:其当前分支;但是,不推荐这样做,除非你
远程:错误:安排更新其工作树以匹配您推送的内容
远程:错误:其他方式。
远程:错误:
远程:错误:要压制此消息并仍保持默认行为,请设置
远程:错误:“receive.denyCurrentBranch”配置变量为“拒绝”。
[剪]
我不知道如何在不丢失开发人员在其本地计算机上已有的宝贵 checkin 历史记录的情况下正确执行此操作。
有人能指出我遗漏的基本步骤或概念吗?
谢谢!
最佳答案
如果你想push
对于 repo 协议(protocol),默认情况下禁止使用 push
到当前 checkout 的分支。
为了避免这种情况,中央仓库(每个人都推送的仓库)通常创建为 bare
repo 协议(protocol),即它们只包含版本控制信息,没有 checkout 的工作副本。这些 repo 协议(protocol)按照惯例命名为 <repo-name>.git
.您可以使用 --bare
创建一个裸仓库在 git init
上标记
git init --bare myrepo.git
但问题是你复制了一个本地.git
文件夹到 my.server.com
而不是在那里创建一个裸仓库。在 .git/config
,有 repo 是否裸露的信息。在工作副本中,bare
是假的,这个信息现在在服务器上。
解决这个问题的正确方法是
- 在服务器上创建一个裸仓库(如上所写)
- 将此存储库添加为
remote
在你的工作副本中
git remote
add origin git@my.server.com:MyProject.git
- 将你本地仓库的内容推送到
origin
git push
--force --all origin
关于git - Xcode 4混帐: 'moving' local git project to our remote server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865427/