如何防止 Git 在“结帐”时使用“umask”或以其他方式保留现有文件和目录权限?

问题描述

我有一个存储库,其中某些文件应具有 600 权限。那是 chmod 600 <file>,即使 umask 022,如果我再次编辑该文件并写入它(例如通过 Emacs),600 权限将被保留并且不会根据 {{1} }.在我看来,这是正确的行为,或者至少是我所希望的。

现在,当我确定这些更改很糟糕并且我想放弃它们时,我可以发出 umask。但是,在这种情况下,Git 以某种方式强制此文件上的 git checkout -- <file> 并且权限变为 umask 022。为什么?

我怎样才能摆脱这种侵入性行为?这个编辑器(例如 Emacs)在保留权限方面是聪明的还是 Git 对我强制 644 的? umask 022 到目前为止也没有效果

解决方法

当 Git 将文件写入工作树时,它总是删除文件并替换它。这与许多编辑器的工作方式不同,他们从一开始就截断和重写文件,但好处是可以更轻松地检测磁盘不足等故障情况,而不会破坏工作树。

当 Git 执行此操作时,它始终使用 umask 设置,因此无法控制此设置。无论如何,这就是操作系统默认执行的操作,因此每次重写文件时都会遇到此问题。请注意,core.sharedrepository 仅控制 .git 目录中的文件,而不是工作树。

您可以尝试使用 post-checkout 钩子来设置文件的权限,但请注意,您可能还想运行 git update-index,因为 Git 会认为这些文件可能是脏的,并重新- 下次运行 git status 时阅读它们。