【问题标题】:Remove execute permission of the symbolic link macOS删除符号链接macOS的执行权限
【发布时间】:2021-08-19 15:03:57
【问题描述】:

我的文件夹结构如下:

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 是使用以下命令创建的符号链接: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'

【问题讨论】:

  • name1.h 是否在同一个存储库中?
  • 是的,它在同一个存储库中。此外,我尝试删除符号链接,在没有执行权限的情况下再次创建它们,然后提交和推送。在我系统的本地副本上,这些文件仍然显示为不可执行,但在远程(bitbucket 存储)上,它们具有执行权限。再次克隆 repo 时,执行权限也出现在我的系统上。
  • 符号链接上的 x 位是没有意义的。符号链接在名称查找期间被替换,除非您正在执行 lstat() 调用(或等效)并且符号链接是最后一个组件;然后使用符号链接的 target 上的权限。 (至于 Git 本身,请参阅下面的 Matt 的回答:Git 只存储对象是符号链接的事实,而不是任何模式位。)
  • @torek 你是对的。似乎是错误显示符号链接的权限状态的bitbucket stash问题。

标签: git terminal permissions execute chmod


【解决方案1】:
设置可执行标志

在 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
符号链接处理

在内部,Git 使用一个简化的模型,识别模式的数量有限。对于 blob/文件,如下所示:100644 = 普通文件,100755 = 可执行文件,120000 = 符号链接 (reference) .因此,Git 不支持存储符号链接的权限。这是有道理的,因为 Git 遵循 UNIX 并且在 Linux 中无法更改符号链接的权限 (=0777) 并且它们不用于任何操作 (reference)。 git update-index 无法更改模式(可执行标志),因为这只适用于常规文件。我在文档中找不到这个特定提示,但快速查看source code 就清楚了。

在 MacOS 上,符号链接可以具有权限,但 Git 无法跟踪它们。重要的是要注意(在 MacOS 上)当引用的文件没有设置可执行标志时,您不能使用可执行文件=true 的符号链接来执行链接文件。

有问题的工作流程

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

这不工作(!):

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。因此,文件模式不再有阶段性更改。

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2020-11-10
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多