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

Ick*_*und 38 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

are*_*ick 32

对于它的价值,当我有这个问题,但承诺-我当试图git-repackgit-gc,但既不工作.我得到了一个权限被拒绝的错误,这导致我chown递归到我预期的用户的整个repo,然后我可以提交/推/拉没有问题.


Von*_*onC 30

在" 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
Run Code Online (Sandbox Code Playgroud)

正如" Git垃圾收集似乎没有完全发挥作用 "中提到的那样,a git gc --aggressive本身既不充分也不够.

最有效的组合是添加git repack,但也git prune:

git gc
git repack -Ad      # kills in-pack garbage
git prune           # kills loose garbage
Run Code Online (Sandbox Code Playgroud)


con*_*nny 14

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

您可以通过sharedrepository=true在config的[core]部分中进行设置,使新文件保持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)
Run Code Online (Sandbox Code Playgroud)

编辑:

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

  • 这对我有帮助,因为我不赞成使用repo-config,然后在新的git版本中将其删除,所以只有我使用了git config --global --add core.sharedRepository all。这个问题最初是在我由不同的gits在同一个仓库中工作后出现的:一个是GitBash,另一个是Cygwin安装的。 (2认同)

Lei*_*ell 12

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

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

我们通过首先将所有目录整合到同一组中来解决它,然后用g + w对它们进行全局修改,使它们可以进行组写,最后正确设置每个人的umask,以便所有新创建的桶也可以进行组写.

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


小智 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'
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

从 git-gc(1) 手册页:

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