Git拉错误:无法创build临时sha1文件名

我有一个小的git回购设置,唯一真正的目的是能够在几台机器(工作,家庭,笔记本电脑)本地开发。 因此,我有一个分支,一旦离开计算机,我就会推/拉,一旦我坐下来。 工作得很好,到现在为止。 现在,当我拉上我的“现场testing”机器时,我得到以下结果:

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 

在网上search唯一真正的答案,我可以find以下内容: http : //marc.info/? l= git&m=122720741928774&w=2它基本上说,这是一个虚假的错误,是在一堆之上,因此什么也没有关于什么是错的

我从哪里去了解哪里出了什么问题?

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

对于什么是值得的,当我有这个问题 – 但是当提交 – 我尝试了git-repackgit-gc ,但都没有工作。 我得到了一个权限被拒绝的错误,这导致我把整个reporecursion地递交给我期望的用户,然后我可以提交/推/拉没有问题。

在“ Re:Bug?git svn fetch:”无法创build临时sha1文件名/home/andres/git/public/crystal.g中提到 :

重新包装版本库后,问题消失了。 真的很奇怪

你尝试重新包装吗?

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

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

你有不同的命令来运行,以“清理”你的存储库,从最安全的到更积极的:

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

正如“ Git垃圾收集似乎没有完全起作用 ”中所提到的, git gc --aggressive本身既不足够也不足够。

最有效的组合是joingit repack ,而且git prune

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

当多个用户提交到同一个存储库时,我看到了这个错误,导致由于ssh和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) 

编辑:

此方法仅适用于已有的回购。 你可以在创build仓库时做一次: git --bare init --shared

我们遇到了用户1先前提交过的同样的问题,于是对象/编辑目录被创build并由用户1拥有。因为用户1的默认权限不允许用户2写入,所以用户2不能提交。

git根据需要创build这些目录作为某种types的散列桶(hash bucket),所以根据它们的umask,它们很可能被拥有不同权限的几个不同的人所拥有。

我们先解决了同一个组所有的目录,然后用g + w对它们全部进行chmod修改,这样它们就成为可写的组,最后正确地设置每个人的umask,以便所有新创build的桶也都是组写的。

这是因为我们使用ssh:// URL来检查从git – 我假设如果我们使用gitnetworking协议,它不会发生,因为git守护进程将具有一致的文件所有权。

在我的情况下,我试图推动这个问题。

 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 –grressive,git repack或git prune在本地没有帮助。 请注意错误是如何表示“解包错误”,我认为这是关键,因为它意味着它在另一边。 所以我去了(裸)存储库,并在那里做了一个git gc。 然后我可以推好。

我有这个问题,感觉就像我已经尝试了上述所有的东西。 之前我曾看到过这种情况,这是由于不同用户之间的权限推送到回购,但在这种情况下,每个人都在同一个用户下,并为了好的措施,我已经(在回购)并组合并修改u + w和g + w来衡量。 我仍然收到error: unable to create temporary sha1 filename ./objects/9a

我刚刚做了一些更多的调查,看起来好像有一些权限:在推送之前(在服务器上托pipe的回收站),对象中的所有文件都具有-rw-rw-r--权限, -rw-rw-r--这就是你所期望的。 他们都属于同一个用户和组。 在失败的推后,我可以grep文件的权限设置为-r--r--r-- ,即不能被任何人写,并显示他们的位置与bash命令find . -perm 444 | xargs ls -l find . -perm 444 | xargs ls -l 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更新/replace文件(给他们一个新的时间戳),更改过程中的权限,然后抱怨权限。 我完全难以理解这是怎么回事:(

我在使用git push时候遇到了这个问题

然后我运行git gc ,它工作。

从git-gc(1)手册页:

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

我的问题是一个权限问题

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

那么一切都工作了。

然后我去删除repo和权限被拒绝,检查烫发,并确定烫发已被更改,我正在运行的用户没有写访问…

就我个人而言,当我做一个git push origin master的时候,我遇到了这个问题。 对我来说,解决scheme是:在我的服务器上,我在包含我的存储库的目录中以root身份login并recursion执行:

 chown -hR MyGitUser MyRepo 

一切正常

我只有一个git用户,其他人通过发布他们的公钥与ssh连接。 如果你configuration了几个git用户,你必须为每个用户做同样的事情。

如果其他人得到这个错误,我已经遇到了跨越windows-linux鸿沟的工作。 似乎如果换行到Windows格式,你仍然可以在某些情况下提交,但git然后转换为Linux格式。

所以,如果新行是唯一的改变,那么我们现在有两个相同的提交连续。 由于提交哈希是从提交文件数据生成的,并且每个哈希都具有相同的数据,所以它们以相同的哈希结束。 至less在我的情况下,这就是“文件存在”所表示的。 混帐让所有的困惑。

我通过执行git reset --hard修复它 – 在本地和在中央回购中git reset --hard

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

我曾经看到这个错误,并追踪到权限问题。 我无法find它是如何造成的,但不知何故git已经作为一个没有对某个对象目录的写入权限的组运行。

我没有看到任何明显的原因在代码中,并假设这是一个OS X的权限问题,大概是从一些草率的制作或安装。

我有一个类似的错误,这不是一个权限问题(我是存储库的唯一用户),并没有任何gc / repack技术的工作。 最后,我只是把旧的远程存储库放在一边,并推出了一个新的。 幸运的是它非常小。

利亚姆

应该指出的是,您需要修复您推送到的存储库的权限,而不仅仅是您的工作权限。

更改用户组+权限为我工作。 我注意到,一些用户的提交是在不同的组。 将全部更改为同一组解决了这个问题。

在sshfs上工作时,我得到这样的错误。 它卸载后自行修复,然后重新安装共享。

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

这不是一个真正的解决scheme,但我可以帮助那里的人。

在尝试部署到heroku时,我遇到了这个问题。 事实certificate,我有一个gem写了一个文件到tmp /目录,而且heroku不喜欢这个。 拿出文件,瞧,问题解决了。 看到这个: https : //devcenter.heroku.com/articles/read-only-filesystem

我最近有这个问题,我试了一下这个线程没有运气。 我的VPS上剩下很多磁盘空间,但是事实certificate,由于没有清理部署文件夹,我已经超出了inode限制(可能是由于JS库在处理之前包含了100个文件)。

我删除了一个旧的部署负载,一切工作正常。

我意识到这是一个边缘案例,但是如果一切都失败了,就要记住这一点。