我在笔记本电脑的硬盘上设置了一个本地仓库,位于c:\someFolder\.git
。我想在x:\someOtherFolder
的Windows服务器上设置远程仓库作为备份。以下是我到目前为止采取的步骤:
在x:\someOtherFolder
中,打开了一个git bash会话并输入了git clone "c:\someFolder"
。收到消息Cloning into 'someFolder'...done.
在c:\someFolder
中,打开了一个git bash会话并输入了git remote add origin "x:\someOtherFolder"
。声明在没有回复的情况下执行。
在本地项目文件中进行了一些更改,并将其提交到git commit -am
的本地仓库。
从c:\someFolder
git bash,输入git push origin master
。回复是:
-
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.
等
我觉得我可能错误地设置了遥控器。我该怎么做呢?
答案 0 :(得分:2)
远程服务器只能是一个裸存储库(没有内容的存储库)
要拥有这样的存储库,您需要使用--bare
标志
# create a (bare) remote repository
git init --bare
现在您应该看到.git
文件夹的内容作为该存储库的文件系统,您可以开始使用它。
远程存储库没有任何工作目录。它只包含从所有其他本地存储库推送到其中的所有内容。
对进行了投票并注意到您不需要裸存储库的用户:您不需要它但这是惯例。
在这里阅读所有相关内容: https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server
为了初步设置任何Git服务器,您必须将现有存储库导出到新的裸存储库 - 不包含工作目录的存储库 。
这通常很简单 要克隆存储库以创建新的裸存储库,请使用 - bare 选项运行clone命令。
答案 1 :(得分:1)
不,你做的一切都正确,你刚刚陷入特殊情况。
也就是说,在push git中更新远程仓库中的指定引用。在您的示例中,这是master
someOtherFolder
分支。没关系,但是由于当前正在检出master
分支,因此git会默认阻止推送,保留远程目录中可能的更改。
您有三种选择:
尽管如此,如果你认为有意,你仍然可以进入someOtherFolder
。执行git push --force
,不要忘记重置someOtherFolder
的工作树,git reset --hard
来自someOtherFolder
。但是,这仅适用于少数特殊情况。假设,someOtherFolder
是一个"木偶存储库"其中应仅包含someFolder
存储库中所做的更改。您可能会发现在receive.denyCurrentBranch = warn
中设置someOtherFolder
配置设置很有用。
将您的更改推送到someOtherDirectory
:git push origin master:another_master
中的另一个分支。因此,您只会在another_master
中创建分支someOtherFolder
,然后可以在其中使用master
执行任何操作。
更典型的解决方案是获取在someFolder
中对someOtherFolder
进行的新更改:在someOtherFolder
内执行git fetch
和您将在远程分支origin/master
中获得新的更改。