繁体   English   中英

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

[英]Git pull error: unable to create temporary sha1 filename

我有一个小的 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 基本上说明这是一个虚假的错误,位于一堆之上,因此什么也没说关于真正有什么问题。

我该从哪里了解问题所在?

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

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

重新打包存储库后,问题就消失了。 真的比较奇怪。

你试过重新打包吗?

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

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

可以运行不同的命令来“清理”您的存储库,从最安全的到更激进的:

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

正如“ Git 垃圾收集似乎不能完全工作”中所述, git gc --aggressive是不够的。

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

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

无论如何,当我遇到这个问题时——但在提交时——我尝试了git-repackgit-gc ,但都没有奏效。 我被拒绝的错误权限,害得我chown递归整个回购协议我希望它是用户,然后我可以提交/推/拉没有问题。

当多个用户提交到同一个存储库时,我看到了这个错误,由于ssh 和 umask导致组写入权限问题

您可以通过在配置的 [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)

编辑:

此方法仅适用于已存在的 repos。 您可以在创建存储库时立即完成: git --bare init --shared

我们遇到了同样的问题,用户 1 之前提交过,因此创建了 objects/ed 目录并归用户 1 所有。由于用户 1 的默认权限不允许用户 2 写入,因此用户 2 无法提交。

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

我们解决了这个问题,首先 chgrping 由同一组拥有的所有目录,然后用 g+w 对它们全部进行 chmodding,使它们可被组写入,最后正确设置每个人的 umask,以便所有新创建的存储桶也可被组写入。

这是因为我们使用 ssh:// URL 从 git 签出 - 我假设如果我们使用 git 网络协议,它不会发生,因为 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 --agrressive、git repack 或 git prune 本地没有帮助。 请注意错误如何说“解包器错误”,我认为这是关键,因为它暗示它在另一边。 所以我去了(裸)存储库并在那里做了一个 git gc 。 然后我可以推得很好。

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

然后我运行git gc ,它起作用了。

从 git-gc(1) 手册页:

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

我遇到了这个问题,感觉我已经尝试了上述所有方法。 我以前见过这个,这是由于推送到 repo 的不同用户之间的权限,但在这种情况下,每个人都在同一个用户下推送,只是为了更好的衡量,我(在 repo 上)将所有内容都归还给了正确的用户和 group 和 chmodded u+w 和 g+w 以获得良好的度量。 我仍然收到error: unable to create temporary sha1 filename ./objects/9a

我刚刚做了更多的调查,似乎确实有一些权限问题:在推送之前,在 repo(这是一个托管在服务器上的裸 repo)上,对象中的所有文件都具有-rw-rw-r--权限-rw-rw-r--设置,这正是您所期望的。 它们都归同一个用户和组所有。 推送失败后,我可以搜索权限设置为-r--r--r-- ,即任何人都不可写,并使用 bash 命令find . -perm 444 | xargs ls -l显示它们的位置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 正在更新/替换文件(给它们一个新的时间戳),更改进程中的权限,然后抱怨权限。 我完全被这里发生的事情难住了:(

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

因此,如果新行是唯一的更改,那么我们现在有两个相同的连续提交。 由于提交哈希是从提交文件数据生成的,并且每个都具有相同的数据,因此它们最终具有相同的哈希。 至少在我的情况下,这就是“文件存在”所表明的。 Git整个人都糊涂了。

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

我的问题是权限问题

我上目录然后 cp -R repo repo_copy

然后一切正常。

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

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

chown -hR MyGitUser MyRepo

一切正常

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

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

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

我最近遇到了这个问题,我尝试了这个线程上的所有内容,但没有成功。 我的 VPS 上还有大量磁盘空间,但结果证明由于没有清理部署文件夹,我超出了 inode 限制(可能是由于我在处理它们之前包含了 100 个文件的 JS 库)。

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

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

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

利亚姆

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

更改用户组 + 权限对我有用。 我注意到一些用户的提交在不同的组下。 将所有更改为同一组可解决此问题。

在 sshfs 上工作时,我会遇到这样的错误。 它会在卸载并再次安装共享后自行修复。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM