删除符号 link macOS 的执行权限

Remove execute permission of the symbolic link macOS

我有以下文件夹结构:

ls -l
total 0
lrwxr-xr-x  1 user  DF\Domain Users  23 Jun  1 13:25 name1.h -> ./../../name1.h

执行以下命令后:

chmod -x name1.h
chmod -h -x name1.h
chmod g-x name1.h
chmod o-x name1.h

结果还是一样:

ls -l
total 0
lrwxr-xr-x  1 user  DF\Domain Users  23 Jun  1 13:25 name1.h -> ./../../name1.h

name1.h 是使用以下命令创建的符号 link:ln -s.

如何在 macOS 上删除该文件的执行权限,以便将其提交给Git

另一种无效的方法:

git update-index --chmod=-x fs_ccf_log.h
fatal: git update-index: cannot chmod -x 'src/SwiftPackage/include/name1.h'
设置可执行标志

Adding/removing Git 中文件的可执行标志可以通过多种方式完成,并且在某些情况下可能会出错(本答案末尾的示例)。最安全的方法是在工作目录和索引中显式更新它。

这是删除文件上的可执行标志的方法(使用 +x 添加它)可靠地:

chmod -x test.sh             # direct change of mode in the working directory
git add --chmod=-x test.sh   # stage while explicitly changing the mode
git commit
符号link处理

在内部,Git 使用具有有限数量可识别模式的简化模型。对于 blobs/files,这些如下:100644 = 普通文件,100755 = 可执行文件,120000 = symbolic link (reference). In consequence, Git does not support storing permissions for symlinks. This makes sense as Git follows UNIX and in Linux permissions on symlinks cannot be changed (=0777) and they are not used in any operations (reference). git update-index fails to change the mode (executable flag) since this only works on regular files. I could not find this specific hint in the documentation but a quick look at the source code 表示清楚。

在 MacOS 上,symlink 可以拥有权限,但不能被 Git 跟踪。重要的是要注意(在 MacOS 上)当引用的文件没有设置可执行标志时,您不能使用 symlink 和 executable=true 执行 linked 文件。

有问题的工作流程

我曾看到开发人员错误地更改了暂存区(索引)中的可执行标志,然后以原始模式将文件重新添加到索引中。总体而言,未应用所需的更改。

这个工作(!):

git update-index --chmod=-x test.sh
git add test.sh
git commit

在第一行之后,模式更改为100644如我们所料:

$ git diff --cached
diff --git a/test.sh b/test.sh
old mode 100755
new mode 100644

但是,工作目录中文件的模式没有改变,现在显示为未暂存的更改(在暂存区模式是 100644):

$ git diff
diff --git a/test.sh b/test.sh
old mode 100644
new mode 100755

当我们现在执行 git add test.sh(或任何其他暂存文件更改的命令)时,模式将变回 100755。因此,文件模式不再有阶段性更改。