Git错误“无法写入sha1文件名...权限被拒绝”

21

我正在Windows上使用Git。这是我所做的:在机器M1上进行开发,创建了一个裸库(bare repository)并将其保存在USB驱动器M2上以备份位于M1上的仓库。我使用以下命令(从M1上的Git bash中执行)进行备份:

git push --mirror "f:\repo"

没有任何问题地工作。 然后我买了一台新机器 M3。我从 M2 克隆了代码库到 M3:

git clone "f:\repo" .

在 M3 的 git bash 上对存储库进行了一些提交。

git push --mirror "f:\repo"  

我遇到了这个错误: 无法写入 sha1 文件名... 权限被拒绝 我该如何解决?


请参见https://dev59.com/Am865IYBdhLWcg3wZd1W。 - Ian Vaughan
请查看我在 https://dev59.com/Am865IYBdhLWcg3wZd1W#6777323 的回答。 - Ian Vaughan
@morpheus 你需要在这里标记一个答案。 - jcollum
@jcollum - 我无法使用VonC的答案解决我的问题。我从未尝试过dulon的答案。我不再调试这个问题了。 - morpheus
@morpheus 是的,我以前也遇到过这种情况,我通常会将得票最多的答案标记为答案。 - jcollum
5
@jcollum - 这个问题有利有弊。当我看到一个答案被标记为解答时,我就明白了这个答案解决了提问者的问题。因此,如果我不能根据提供的答案解决问题,我会感到困惑和紧张。所以这就是为什么我没有将其标记为答案。人们会点赞如果答案有帮助- 点赞并不意味着这个答案解决了问题。 - morpheus
9个回答

16

有点晚了,但这些方法对我都没用。我不得不在远程代码库中运行sudo git gc,这样一来所有的问题都解决了。

之后我再次进行推送,然后它就成功了。


谢谢 - 除此之外,我还需要在.git文件夹中更改所有者为andy:andy。我已经更改了一些权限设置,但是直到运行这个命令后才出现了那个错误。 - Andy
1
在裸仓库站点上运行 git gc 也为我解决了这个问题。 - ngong

8
即使是有关不同上下文(git+ssh)的问题,请检查与您的repo相关联的ACL。
例如,请参阅此博客文章
如在SO问题“Git pull error: unable to create temporary sha1 filename”中建议的(其中还有其他有趣的建议),请尝试重做您的裸repo,这次使用以下配置:
git config core.sharedRepository true

1
因为远程仓库的权限问题,我遇到了这个错误。在我的情况下,是ssh用户不正确导致了权限问题。

1

我的特定错误信息:

error: unable to write sha1 filename ./objects/ee/7ed0ef8db273d8d0acef46f3cc8ad0ae140d50: Permission denied

我刚刚解决了我的问题。原来是仓库的问题。 在/GIT/HOME/projectdir/objects/目录下,
执行ls命令,你应该能看到很多由两个字母组成的目录:
00  0a  14  1e  28  32  3c  46  50  5a  64  6e  78  82  8c  96  a0  aa  b4  be  c8  d2  dc  e6  f0  fa
01  0b  15  1f  29  33  3d  47  51  5b  65  6f  79  83  8d  97  a1  ab  b5  bf  c9  d3  dd  e7  f1  fb
02  0c  16  20  2a  34  3e  48  52  5c  66  70  7a  84  8e  98  a2  ac  b6  c0  ca  d4  de  e8  f2  fc
03  0d  17  21  2b  35  3f  49  53  5d  67  71  7b  85  8f  99  a3  ad  b7  c1  cb  d5  df  e9  f3  fd
04  0e  18  22  2c  36  40  4a  54  5e  68  72  7c  86  90  9a  a4  ae  b8  ... (many others removed) info pack

这里只列举了一些例子(触发错误消息的ee是其中之一)。ls -l将显示一些目录具有只读权限。使用git帐户,在那些缺少写标签的目录上执行chmod -R +w解决了我的问题。在我的情况下,包括“ee”在内的几个目录缺少写入权限。


0

我也遇到了同样的错误,但通常是在Windows机器上使用bash进行“git pull”时发生。

对我来说,这与其他应用程序有关(通常是病毒检查器),它通过保持.git目录而引起冲突。

我通常可以再做几次“git pull”,最终它会工作正常(在不同哈希值上失败并显示相同的权限被拒绝错误),或者如果我感到匆忙,我会停止我的病毒检查器,执行git pull(第一次成功地完成而没有权限错误),然后非常快地再次打开病毒检查器。


0

我曾经遇到过同样的问题,通过进入 C:\Program Files\Git 然后右键单击 git-bash.exe -> 属性 -> 兼容性 -> 以管理员身份运行此程序,成功解决了这个问题。


尝试在本地仓库提交时捕获相同的错误。谢谢。 - Mikhail Kh

0

这也可能发生在您的远程位于同一台机器上并由root拥有的情况下。

$ git remote -v
origin  /root/git/project.git (fetch)
origin  /root/git/project.git (push)

在这种情况下,您需要将其作为root推送或调整远程权限以允许不同的用户进行推送。

0

我们遇到了这个问题,因为一位同事在他的.bashrc中没有正确设置umask,导致他提交的任何文件都被设置为只读,对于我们其他人尝试写入相同文件的更改而言,这是一个问题。

您可以为所有用户在/etc/bashrc或/etc/profile文件中设置umask。默认情况下,大多数Linux发行版将其设置为0022(022)或0002(002)。打开/etc/profile或~/.bashrc文件,输入:

# vi /etc/profile

或者

$ vi ~/.bashrc

追加/修改以下行以设置新的umask:

umask 022

保存并关闭文件。更改将在下次登录后生效。所有UNIX用户都可以在其/etc/profile文件、~/.profile(Korn / Bourne shell)、~/.cshrc文件(C shells)、~/.bash_profile(Bash shell)或~/.login文件(定义用户登录时的环境)中覆盖系统umask默认值。

这里有一个解释umask权限的链接


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。-【来自审查】 - Jonathan Eustace
1
非常感谢您的提示。这是我在这个网站上的第一条评论,我会学习并改进。 - Jamie Edwards
编辑并添加了一些说明作为我的答案的一部分。 - Jamie Edwards

0

我在过去两天中遇到了这个问题,最终找到了解决方法。错误的原因是分支(在远程仓库中)你想要推送的分支当前正在被检出。当应用 --mirror--all 选项时,至少一个分支被检出,因此会出现权限被拒绝的情况。

所以只需切换到远程的另一个分支并在本地应用 push,这次就可以成功了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接