`.git/objects/` 目录内容:让 git 设置写权限而不是“只读”

Est*_*eis 4 git

我的问题是 git repos 与任何其他目录不同,不会被删除rm -r- 您需要指定rm -rf. 这是因为目录中的所有文件.git/objects都具有只读权限。我的问题是:

我必须设置什么设置,或者我必须对什么源文件进行手术,才能使 git.git/objects/...使用权限/umask 644 而不是 444 权限存储其文件,也就是用户的读写权限,组和其他人的只读权限?它不需要更改现有的目标文件,只要从此以后的所有目标文件都是可写的。


(这一行下面的两个部分不是问题的一部分:只是我调查过的死胡同,以及对“你不应该想要那样”的本能的先发制人的回应。随意跳过。)


我试过的资源

  • 勤奋的网络搜索——没有运气
  • git help config-- 设置tar.umask = user看起来很有希望,但问题仍然存在。
  • SO 问题Git Directory Permissions Always 000及其到索引格式中的 umasks 的链接——这些是关于索引,而不是关于对象目录。此外,没有提到如何更改目标文件的 umask。

'这不是你想要的'

我意识到像“你不应该想要那个”/“那是故意的”/“然后不要那样做”/“只记得rm -rf用于 git 存储库”之类的答案很诱人,在这里,但它们不是我想要的寻找。一些抢先反应:

  • “目标文件是有意为只读的,因为用户不应该编辑它们”:将它们设为只读是过大的:它会阻止编辑删除,即使删除 git 存储库是一种常见且合法的愿望。目标文件的“不意外编辑”性质在其他方面非常明显:它们存在于.git/objects/; 它们具有基于哈希的名称;他们有二进制内容。
  • 如果,看完前一点,你还害怕误编辑:实验已经尝试过,并且是成功的。水银库有一个.hg/store/可写的。我从来没有听说过有人(包括我自己)不小心编辑了它;平淡无奇rm -r my_hg_repo

Ada*_*sen 5

我在下面的回答并不是您问题的解决方案,只是关于 git 维护者做出此选择的原因和地点的更明确信息。

请参阅:为什么 git 创建只读 (444) 文件?堆栈溢出问题参考了相关的源代码文档

我找不到任何相关设置。

这种 git 行为给我带来了个人、本地、离线、裸 git 存储库的问题。我需要 .git 目录中的所有内容都是用户可写的,因为我使用自定义 bitrot 检测器,并且该 bitrot 检测器通过将校验和写入扩展文件属性以供以后验证来工作。如果有一个 git 配置选项,当然会很好,但我猜可写索引文件是一种边缘情况,git 维护者甚至可能不接受添加一个补丁。或者他们可能。


我确定您已经完成了下面的所有其他内容,但为了完整性以及希望这些 git 内部文件具有更多打开权限的任何其他人,我会将其包括在内。

我想象 git 维护者对这些文件使用 0444 perms,我基本上同意他们的决定,所以我使用了一种相当暴力的解决方法。在运行我的 bitrot 检测器之前,我给自己写权限:

find .git/objects/ -perm /u+w | xargs -r chmod u+w
Run Code Online (Sandbox Code Playgroud)

之后我将其删除:

find .git/objects/ -perm /u+w | xargs -r chmod u-w
Run Code Online (Sandbox Code Playgroud)

由于 git 是“特殊的”,它的只读文件可能是别名gitnuke(或使其成为函数)rm -rffind像我上面那样做一个变通方法。旁注:rm -rf无论如何,我通常使用递归删除任何目录树,所以我从未遇到过您面临的问题。