5

我在我的 Windows 7 机器上使用 git,推送到 Server 2008 机器上的共享文件夹。在过去的 6 个月里,这一直运行良好。但是,截至昨天,我无法再推送到远程仓库。每次我尝试,我都会得到以下信息:

$ git push
Counting objects: 39, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (23/23), 8.42 KiB, done.
Total 23 (delta 15), reused 0 (delta 0)
Unpacking objects: 100% (23/23), done.
error: Couldn't set refs/heads/my-branch
To //my-server/Code/my-project.git
 ! [remote rejected] my-branch -> my-branch (failed to write)
error: failed to push some refs to '//my-server/Code/my-project.git

谷歌搜索“未能推送某些参考”错误会给出关于没有先拉(我完全是最新的)和没有正确权限(我可以完全访问所有内容,并且可以创建/删除/编辑文件)的各种结果通过资源管理器在远程仓库中)。

然后,我偶然发现了这篇博客文章http://henke.ws/post.cfm/error-failed-to-push-some-refs,其中提到您可能必须在远程存储库上运行一些清理命令。所以我在远程存储库上运行了 git gc :

$ git gc
Counting objects: 3960, done.
Compressing objects: 100% (948/948), done.
Writing objects: 100% (3960/3960), done.
Total 3960 (delta 2971), reused 3942 (delta 2964)

你瞧,我又能推了!

$ git push
Counting objects: 39, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (23/23), 8.42 KiB, done.
Total 23 (delta 15), reused 0 (delta 0)
Unpacking objects: 100% (23/23), done.
To //my-server/Code/my-project.git
   8153afd..1385d28  my-branch -> my-branch

但是,问题是我现在每次想要执行 push 时都必须在远程存储库上运行 gc 。如果我不这样做,我会再次收到“无法推送一些参考”错误。

那么,为什么我的回购如此失败?我怎样才能永久解决这个问题?

4

1 回答 1

4

看来您正在推送 Windows 网络共享,而不是使用 ssh 或 git 协议。这意味着您的本地计算机必须将文件写入网络共享,因此可能会受到与该服务器相关的任何锁定文件或权限问题的阻碍。

推送分支时,在写入对象后,git 将通过写入文件 .git/refs/heads/my-branch 来更新分支的 ref。看来该文件当前不可从您的客户端写入。

当您执行 gc 时,将从 refs 目录中的松散文件中收集 refs 并将其放入文本文件 .git/packed-refs 中,然后删除单个 ref 文件。

我的理论是,当 ref 作为服务器上的松散文件存在时,您的推送失败,因为您无权覆盖现有文件,而您确实有权创建新文件。使用 gc 打包 refs 后,ref 文件不再存在,因此您可以再次推送一次。

我建议的修复是:

  1. 验证您是否可以覆盖客户端的现有文件,如果不能修复权限或文件锁定问题
  2. 切换到使用 git 协议,这个博客似乎很好地概述了 Windows 的选项http://freshbrewedcode.com/derekgreer/2012/02/19/hosting-a-git-repository-in-windows/

作为最后的手段,如果你发现自己被 gc 选项卡住了,你可以尝试运行 'git pack-refs -all'。这将比每次使用 gc 解决问题要快。

于 2012-09-20T23:57:39.000 回答