试图设置远程仓库并推送它,让人感到困惑

时间:2016-04-20 00:01:38

标签: git bash

我在笔记本电脑的硬盘上设置了一个本地仓库,位于c:\someFolder\.git。我想在x:\someOtherFolder的Windows服务器上设置远程仓库作为备份。以下是我到目前为止采取的步骤:

  1. x:\someOtherFolder中,打开了一个git bash会话并输入了git clone "c:\someFolder"。收到消息Cloning into 'someFolder'...done.

  2. c:\someFolder中,打开了一个git bash会话并输入了git remote add origin "x:\someOtherFolder"。声明在没有回复的情况下执行。

  3. 在本地项目文件中进行了一些更改,并将其提交到git commit -am的本地仓库。

  4. c:\someFolder git bash,输入git push origin master。回复是:

  5. -

    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.
    

    我觉得我可能错误地设置了遥控器。我该怎么做呢?

2 个答案:

答案 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会默认阻止推送,保留远程目录中可能的更改。

您有三种选择:

  1. 尽管如此,如果你认为有意,你仍然可以进入someOtherFolder。执行git push --force,不要忘记重置someOtherFolder的工作树,git reset --hard来自someOtherFolder。但是,这仅适用于少数特殊情况。假设,someOtherFolder是一个"木偶存储库"其中应仅包含someFolder存储库中所做的更改。您可能会发现在receive.denyCurrentBranch = warn中设置someOtherFolder配置设置很有用。

  2. 将您的更改推送到someOtherDirectorygit push origin master:another_master中的另一个分支。因此,您只会在another_master中创建分支someOtherFolder,然后可以在其中使用master执行任何操作。

  3. 更典型的解决方案是获取someFolder中对someOtherFolder进行的新更改:在someOtherFolder内执行git fetch和您将在远程分支origin/master中获得新的更改。