为 Windows 上的 chmod 值查询 git 索引

Query git index for chmod values on Windows

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

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

I'd like to create a pre-commit hook to check for [executable permission] in the git index, and warn me if it's not present. However, there doesn't seem to be a git query-index type command to allow me to check if the file's been granted executable permissions.

要从 Git 的索引中读取信息,请使用 git ls-files --stage。没有参数,这会转储出整个索引内容;使用路径规范(文件或目录名称、glob 表达式等),它会转储出与路径规范匹配的名称。

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

请注意,这仅与 Git 的索引设置有关。 Windows 文件系统使用不同的安全模型,这不太适合 Git 的 execute/no-execute 概念。请参阅 this SuperUser answer 及其对一些 link 到 Cygwin-related 关于 Cygwin 如何实现其 chmod 的讨论的评论。


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