如何防止 Git 在 'checkout' 上使用 'umask'(或以其他方式保留现有文件和目录权限)?

How to prevent Git from using 'umask' upon 'checkout' (or otherwise preserve the existing file and directory permissions)?

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

现在,当我认为这些更改不好并且我想放弃它们时,我可以发出 git checkout -- <file>。但是,在这种情况下,Git 以某种方式强制对该文件使用 umask 022,并且权限变为 644。为什么?

我怎样才能摆脱这种侵入性行为?这个编辑器(例如 Emacs)是聪明地保留权限还是 Git 强迫我 umask 022git config --add core.sharedrepository 0077 到目前为止也没有效果。

当Git将文件写入工作树时,它总是删除文件并替换它。这与许多编辑器的工作方式不同,他们从头开始 运行 整理和重写文件,但好处是更容易检测故障情况,如磁盘不足情况,而不会破坏工作树.

当Git这样做时,它总是使用umask 设置,所以没有办法控制这个设置。无论如何,这就是操作系统默认执行的操作,因此只要文件被重写,您就会遇到这个问题。请注意,core.sharedrepository 仅控制 .git 目录中的文件,而不是工作树。

您可以尝试使用 post-checkout 挂钩来设置文件的权限,但请注意您可能还想 运行 git update-index 因为 Git否则会认为这些文件可能很脏,并在下次 运行 git status.

时重新阅读它们