如何防止 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 022
? git config --add core.sharedrepository 0077
到目前为止也没有效果。
当Git将文件写入工作树时,它总是删除文件并替换它。这与许多编辑器的工作方式不同,他们从头开始 运行 整理和重写文件,但好处是更容易检测故障情况,如磁盘不足情况,而不会破坏工作树.
当Git这样做时,它总是使用umask 设置,所以没有办法控制这个设置。无论如何,这就是操作系统默认执行的操作,因此只要文件被重写,您就会遇到这个问题。请注意,core.sharedrepository
仅控制 .git
目录中的文件,而不是工作树。
您可以尝试使用 post-checkout
挂钩来设置文件的权限,但请注意您可能还想 运行 git update-index
因为 Git否则会认为这些文件可能很脏,并在下次 运行 git status
.
时重新阅读它们
我有一个存储库,其中一些文件应该具有 600
权限。那是 chmod 600 <file>
,即使 umask 022
,如果我再次编辑该文件并写入它(例如通过 Emacs),600
权限将被保留并且不会根据 umask
.在我看来这是正确的行为,或者至少是我所希望的。
现在,当我认为这些更改不好并且我想放弃它们时,我可以发出 git checkout -- <file>
。但是,在这种情况下,Git 以某种方式强制对该文件使用 umask 022
,并且权限变为 644
。为什么?
我怎样才能摆脱这种侵入性行为?这个编辑器(例如 Emacs)是聪明地保留权限还是 Git 强迫我 umask 022
? git config --add core.sharedrepository 0077
到目前为止也没有效果。
当Git将文件写入工作树时,它总是删除文件并替换它。这与许多编辑器的工作方式不同,他们从头开始 运行 整理和重写文件,但好处是更容易检测故障情况,如磁盘不足情况,而不会破坏工作树.
当Git这样做时,它总是使用umask 设置,所以没有办法控制这个设置。无论如何,这就是操作系统默认执行的操作,因此只要文件被重写,您就会遇到这个问题。请注意,core.sharedrepository
仅控制 .git
目录中的文件,而不是工作树。
您可以尝试使用 post-checkout
挂钩来设置文件的权限,但请注意您可能还想 运行 git update-index
因为 Git否则会认为这些文件可能很脏,并在下次 运行 git status
.