【问题标题】:pushing to a git repository does not work推送到 git 存储库不起作用
【发布时间】:2011-03-12 14:35:48
【问题描述】:

我刚开始使用 GIT(我来自 cvs),想用 Git 设置类似于 cvs/svn 的东西。我执行了以下步骤:

cd o:/repository
git init

cd <working directory>
git clone o:/repository

我现在创建了一个名为 file.txt 的文件,其中包含一些内容 执行“git status”会列出适当的更改。

然后我做

git add file.txt
git commit file.txt

两者似乎都可以正常工作。

当我这样做时 git push,我收到以下错误:

No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'o:/repository'

我尝试先进行拉取,并指定推送命令的来源和主变体,但没有奏效。

谁能告诉我我错过了什么。我正在运行 Windows 7 64 位。

附言。我也试过了

git push origin master

我得到以下信息:

Counting objects: 3, done.
Writing objects: 100% (3/3), 251 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
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.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To O:/repository
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'O:/repository'

【问题讨论】:

  • 请注意,Git 2.3.0(2015 年 2 月)允许以更安全的方式推送到非裸仓库:请参阅 my answer below

标签: git version-control versioning


【解决方案1】:

这在几周前发生在我们身上。这意味着您在原始存储库中签出了一个工作目录,并且您无法推送覆盖。

您需要在源头裸露存储库。我不知道用一个命令来做到这一点。我做了什么(在原始存储库)

> mv repository repository.old
> git clone --bare repository.old repository

我看到您的案例的来源是 o:/repository。原点不应该是签出的工作副本,因此您可以按照上述方式初始化裸存储库或副本。要让您描述的场景通过:

cd o:/repository
git init  --bare

cd <working directory>
git clone o:/repository

git push origin master

这对你应该没问题:

好书:http://www.gitready.com/advanced/2009/02/01/push-to-only-bare-repositories.html

【讨论】:

  • 谢谢,这行得通,尽管稍作修改,我不得不调用 git push origin master。我希望我可以输入 git push 并且 git 会知道我从哪里签出/克隆。我正要阅读你发给我的链接,希望它能弄清楚 --bare 存储库是什么以及为什么我不能只调用 git push。
  • 哦,只是一个小的后续问题,在 git 中是否没有像在 cvs 中那样定义用户来指定谁可以读取和写入存储库?
  • 据我了解,您将需要第三者为您执行此操作。我们在 linux 服务器上运行 gitosis 以进行内部开发。这是一篇关于如何在 windows svr 2k8 shannoncornish.com/blog/2009/04/gitosis-windows-server-2008 上设置的帖子。但如果让我重新做一遍,我只会使用 gitorious 或 github——这就是我现在为我的个人开发所做的。
  • 轻微的倒退——理论上,您可以使用文件系统权限来管理用户访问。它可能不漂亮,但可以工作。
  • @Coder (3 cmets up):由于 git 使用的分布式模型,没有用户。与 CVS/SVN 不同,不同的人将更改推送到公共共享存储库,在 git 中,一个人控制“主”/“官方”存储库并从其他开发人员那里获取更改。但是你可以通过用可以处理访问控制的计算机程序有效地替换那个人来模拟 CVS/SVN 模型——例如,gitosis 就是这样做的。
【解决方案2】:

对于第一次推送,您需要类似的东西

git push origin master

另请参阅push.default option 选项。

无论如何,如果您稍后会遇到推送到非裸存储库的问题,那么您也需要阅读相关内容。

【讨论】:

  • 是的,对不起,我应该在上面更明确。我也试过这个,我收到了我附加到上述问题的错误消息(不适合评论)。
  • 就像我说的,你需要一个裸仓库才能明智地做到这一点。
  • 这发生在我第一次使用 BitBucket 结帐时。非常感谢!
【解决方案3】:

如果您仍想推送到远程非裸仓库的已签出分支,现在可以(Git 2.3.0,2015 年 2 月),前提是目标工作树中没有修改过的文件。

在那个远程仓库中,做:

git config receive.denyCurrentBranch updateInstead

它比配置receive.denyCurrentBranch=ignore 更安全:只有当您没有覆盖正在进行的修改时,它才会允许推送。

commit 1404bcbJohannes Schindelin (dscho)

receive-pack:为receive.denyCurrentBranch 添加另一个选项

在工作目录之间同步时,可以很方便地通过“push”而不是“pull”来更新当前分支,例如从 VM 内部推送修复程序时,或推送在用户机器上进行的修复程序时(开发人员无权安装 ssh 守护程序,更不用说知道用户的密码了)。

这个补丁不再需要常见的解决方法——推入一个临时分支,然后在另一台机器上合并。

新选项是:

updateInstead

相应地更新工作树,但如果有任何未提交的更改,则拒绝这样做。


作为kd4ttc 添加the comments

这里的想法是,当您远程更新分支时,通常不应将其推回。
其他从服务器拉取并进行更改的人不会知道在他们独立工作时发生了哪些更改。

但是,只有您自己并不那么担心。
做到这一点的干净方法是从存储库中提取,然后创建一个分支:你可以编辑你想要的所有内容。

在未来的某个时间,您然后登录服务器并进行合并。

此选项updateInstead 适用于您希望立即更改文件的情况。

【讨论】:

  • 对于像我一样学习的其他人来说,这里的想法是,如果您远程更新分支,您通常不应该将其推回。其他从服务器中提取并进行更改的人不会知道在他们独立工作时发生了什么更改。然而,只是你的担心没有那么大。做到这一点的干净方法是从存储库中提取而不是创建一个分支。你可以编辑所有你想要的。在未来的某个时间,您然后登录服务器并进行合并。此选项 updateInstead 适用于您需要立即更改文件的情况。
  • @kd4ttc 感谢您的评论:我已将其添加到答案中以获得更多可见性。
【解决方案4】:

正如错误消息所述,您尝试推送到的分支 (master) 已在 origin 存储库中签出。您可以通过转到 o:/repository 并查看不同的分支来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    相关资源
    最近更新 更多