Git pull error:无法创建临时sha1文件名

时间:2009-03-26 11:08:41

标签: git

我有一个小的git repo设置,唯一真正的目的是能够在几台机器(工作,家庭,笔记本电脑)上进行本地开发。因此,我有一个分支,一旦我离开计算机,我提交/推动,拉一下我坐下工作得很好,到现在为止。现在,当我拉上“实时测试”机器时,我得到以下内容:

remote: Counting objects: 38, done.
remote: Compressiremote: ng objects: 100% (20/20), done.
remote: Total 20 (delta 17), reused 0 (delta 0)
error: unable to create temporary sha1 filename .git/objects/ed: File exists

fatal: failed to write object
fatal: unpack-objects failed

在网上搜索我能找到的唯一真正的答案如下:http://marc.info/?l=git&m=122720741928774&w=2基本上表明这是一个虚假的错误,它是最重要的,因此没有说明真正的错误。

我从哪里可以找出问题所在?

编辑:删除本地副本并重新克隆

19 个答案:

答案 0 :(得分:32)

当我遇到这个问题时,它是值得的 - 但是在提交时 - 我尝试了git-repackgit-gc,但都没有奏效。我得到了一个权限被拒绝的错误,这导致我chown递归到我预期的用户的整个repo,然后我可以提交/推/拉没有问题。

答案 1 :(得分:29)

Re: Bug? git svn fetch: "unable to create temporary sha1 filename /home/andres/git/public/crystal.g”中提及:

  

repacking存储库之后,问题就消失了。真的很奇怪。

你尝试重新包装吗?

  

git-repack用于将当前不在“pack”中的所有对象组合到一个包中。它还可以用于将现有包重新组织成一个更有效的包   包是一组对象,单独压缩,应用增量压缩,存储在单个文件中,带有相关的索引文件   包用于减少镜像系统,备份引擎,磁盘存储等的负载

您是否尝试升级到最新版本的Git?

have different commands运行以便“清理”你的存储库,从最安全的存储库到更具侵略性的存储库:

$ git-prune
$ git-gc --aggressive
$ git-repack
$ git-repack -a
$ git-prune-packed

正如“Git Garbage collection doesn't seem to fully work”中所提到的,git gc --aggressive本身就不够,甚至不够。

最有效的组合是添加git repack,还有git prune

git gc
git repack -Ad      # kills in-pack garbage
git prune           # kills loose garbage

答案 2 :(得分:14)

当多个用户提交到同一个存储库时,我看到了这个错误,导致ssh and umask

导致的组写权限问题

您可以通过在config的[core]部分设置sharedrepository=true来使新文件保持g + w模式:

cd /my/shared/repo.git
git repo-config core.sharedRepository true

# (might also need to "chmod -R g+wX ." for each 
# user that owns files in .git/objects)

修改

此方法仅适用于已存在的回购。您可以在创建存储库时执行一次:git --bare init --shared

答案 3 :(得分:12)

我们遇到了用户1先前提交过的相同问题,因此对象/ ed目录是由用户1创建并拥有的。因为用户1的默认权限不允许用户2写入,所以用户2无法提交。

git根据需要将这些目录创建为某种类型的哈希桶,因此它们很可能由具有不同权限的几个不同的人根据其umask拥有。

我们先解决了同一组拥有的所有目录,然后用g + w对它们进行chmodding,然后将它们组成可写,最后正确设置每个人的umask,以便所有新创建的存储桶也是组可写的。

这是因为我们正在使用ssh:// URL从git中检出 - 我假设如果我们使用git网络协议就不会发生这种情况,因为git守护程序会拥有一致的文件所有权。

答案 4 :(得分:6)

就我而言,我在尝试推动时遇到了这个问题。

dieter@dieter-dellD620-arch sugarcrmclient [master] git push origin
Counting objects: 16, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (12/12), 3.91 KiB, done.
Total 12 (delta 1), reused 11 (delta 1)
error: unable to create temporary sha1 filename ./objects/7a: File exists

fatal: failed to write object
error: unpack failed: unpacker exited with error code
To gitosis@tiktak.kangaroot.net:sugarcrmclient.git
 ! [remote rejected] master -> master (n/a (unpacker error))
 ! [remote rejected] web -> web (n/a (unpacker error))
error: failed to push some refs to 'gitosis@tiktak.kangaroot.net:sugarcrmclient.git'

这不是许可问题。 git gc,git gc --agrressive,git repack或git prune本地没有帮助。注意错误如何说“解包器错误”,我认为这是关键,因为它暗示它在另一边。所以我去了(裸)存储库并在那里做了一个git gc。然后我可以推得很好。

答案 5 :(得分:4)

使用git push

时遇到此问题

然后我运行git gc,它有效。

来自git-gc(1)手册页:

git-gc - 清理不必要的文件并优化本地存储库

答案 6 :(得分:4)

我遇到了这个问题,觉得我已经尝试了以上所有的事情。我以前见过这个,这是由于不同用户推送到repo之间的权限,但在这种情况下,每个人都推送到同一个用户,并且只是为了好的措施,我(在回购上)将所有东西都归咎于正确的用户和小组和chmodded u + w和g + w以获得良好的衡量标准。我还在error: unable to create temporary sha1 filename ./objects/9a

我刚刚做了一些调查,似乎确实发生了许可:在推送之前,在repo上(这是一个托管在服务器上的裸仓库),对象中的所有文件都拥有权限-rw-rw-r--设置,这是您所期望的。它们都归同一个用户和组所有。在推送失败后,我可以grep查找权限设置为-r--r--r--的文件,即任何人都无法写入的文件,并使用bash命令find . -perm 444 | xargs ls -l显示其位置。这样做可以提供以下信息:

-r--r--r-- 1 ourusername ourgroupname    730 Nov  4 15:02 ./objects/46/346f550340bc0d3fec24ea42b25999161f8c7a
-r--r--r-- 1 ourusername ourgroupname    177 Nov  4 15:02 ./objects/4c/664ebbfad568de6101a52c01f5117654945d6d
-r--r--r-- 1 ourusername ourgroupname    730 Nov  4 14:36 ./objects/9e/3f572366da9fb319331dfd924ae35cf9fd00ae
-r--r--r-- 1 ourusername ourgroupname    175 Nov  4 14:36 ./objects/aa/f42d7ed706f1d2e4a0aa1c5eb184e17e917204

这些都是最近更改的文件(发布时间为11月4日15:08)。所以,看起来git正在更新/替换文件(给它们一个新的时间戳),更改进程中的权限,然后抱怨权限。我完全不知道这里发生了什么:(

答案 7 :(得分:2)

我的问题是权限问题

我上了目录然后是cp -R repo repo_copy

然后一切都恢复了。

然后我去删除repo并拒绝权限,检查perms并确定已经更改了我正在运行的用户没有写访问权限...

答案 8 :(得分:2)

如果有其他人收到此错误,我在跨越windows-linux鸿沟时遇到过它。似乎如果换行格式转换为windows,你仍然可以在某些情况下提交,但git然后转换为linux格式。

因此,如果新行是唯一的变化,那么我们现在连续有两个相同的提交。由于提交哈希是从提交文件数据生成的,并且每个都具有相同的数据,因此它们最终具有相同的哈希值。至少在我的情况下,这就是“文件存在”所表示的内容。 Git很困惑。

我通过在本地和中央仓库执行git reset --hard来修复它。

答案 9 :(得分:2)

就个人而言,当我做一个git push origin master时,我遇到了这个问题。 我的解决方案是: 在我的服务器上,我使用root登录包含我的存储库的目录并以递归方式执行:

chown -hR MyGitUser MyRepo

一切正常

我只有一个git用户,其他人通过发布他们的公钥与ssh连接。 如果您配置了几个git用户,则必须为每个用户执行相同的操作。

答案 10 :(得分:1)

尝试了一些解决方案,但最终意识到我们的git服务器的磁盘没有剩余可用空间。

答案 11 :(得分:0)

更改用户组+权限对我有用。我注意到一些用户的提交属于不同的组。将所有内容更改为同一组修复了此问题。

答案 12 :(得分:0)

我最近遇到了这个问题,我在这个帖子上尝试了一切,没有运气。我的VPS上剩余了足够的磁盘空间,但事实证明,由于没有清理部署文件夹,我已经超出了inode限制(可能是由于我在包含100个文件之前包含的JS库)。

我删除了大量旧部署,一切正常。

我意识到这是一个有点边缘的情况,但如果其他所有方法都失败了,请记住这一点。

答案 13 :(得分:0)

尝试在heroku上部署时出现此问题。原来我有一个宝石写了一个文件到tmp /目录而heroku不喜欢那样。取出文件,瞧,问题解决了。请参阅:https://devcenter.heroku.com/articles/read-only-filesystem

答案 14 :(得分:0)

在使用sshfs时遇到这样的错误。它在卸载之后自行修复,然后再次安装共享。

答案 15 :(得分:0)

应该注意的是,您需要修复您正在推送的存储库的权限,而不仅仅是您的工作存储库。

答案 16 :(得分:0)

我遇到了类似的错误,并且它不是权限问题(我是存储库的唯一用户),并且没有gc / repack技术有效。最后,我只是将旧的远程存储库移到一边并推出一个新的远程存储库。幸运的是它很小。

利安

答案 17 :(得分:0)

我曾经看过这个错误并将其跟踪到权限问题。我无法找到它是如何引起的,但不知何故git已经作为一个没有对某些对象目录的写权限的组运行。

我没有在代码中看到任何明显的原因,并假设它是OS X权限问题,可能来自一些草率的制作或安装。

答案 18 :(得分:-1)

在linux服务器上使用本地mac - 我尝试了上面的一些建议但没有运气。重新启动,然后它工作。

它不是一个真正合适的解决方案,但我可能会帮助那些人。