问题描述
有什么方法可以测试文件是否被标记为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 分别为100644
和100755
,因此以其中之一开头的每一行代表一个文件,该文件将进入下一次提交。 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格式模式位,这就是为什么存在这些奇数间隙的原因。