在Windows上查询git索引以获取chmod值

问题描述

有什么方法可以测试文件是否被标记为Windows可执行文件

我发现创建外壳脚本时,需要运行git update-index --chmod=+x myfile.sh来设置可执行标志(related docs)。我想创建一个预提交钩子,以检查git索引中的该标志,并警告它是否不存在。但是,似乎没有git query-index类型的命令可以让我检查文件是否已被授予可执行权限。 Git Bash似乎能够看到这一点,因为它以绿色显示了可执行文件,但是我不确定它是如何实现的。

解决方法

我想创建一个预提交挂钩,以检查git索引中的[可执行权限],并警告我(如果不存在)。但是,似乎没有git query-index类型的命令可以让我检查是否已授予文件可执行权限。

要从Git的索引中读取信息,请使用git ls-files --stage。不带参数的情况下,它将转储整个索引内容。带有路径规范(文件或目录名称,全局表达式等),它将转储与路径规范匹配的那些名称。

每行的第一项是 mode 。目前只有两种有效的“文件”模式, 1 分别为100644100755,因此以其中之一开头的每一行代表一个文件,该文件将进入下一次提交。 100644文件是chmod=-x,而100755文件是chmod=+x。任何不是这两种模式之一的文件都不是普通文件。

请注意,这仅与Git的索引设置有关。 Windows文件系统使用不同的安全模型,该模型不适用于Git的执行/不执行概念。有关与Cygwin有关如何实施Cygwin如何实现其chmod的讨论的一些链接,请参见this SuperUser answer及其注释。


1 在非常早的不再使用的Git版本中,允许更多的100xxx模式; xxx部分是标准的Unix chmod权限。发现这是一个错误,因此现在该模式始终为rw-r--r--(644)或rwxr-xr-x(755)。任何具有其他前导位的条目都表示其他内容:120000是符号链接,而160000是gitlink。模式040000是为树对象保留的,但索引不包含此类对象。这些模式位反映了Linux中的inode格式模式位,这就是为什么存在这些奇数间隙的原因。