删除符号 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。因此,文件模式不再有阶段性更改。
我有以下文件夹结构:
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。因此,文件模式不再有阶段性更改。