Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 删除符号链接macOS的执行权限_Git_Terminal_Permissions_Execute_Chmod - Fatal编程技术网

Git 删除符号链接macOS的执行权限

Git 删除符号链接macOS的执行权限,git,terminal,permissions,execute,chmod,Git,Terminal,Permissions,Execute,Chmod,我有以下文件夹结构: 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 User

我有以下文件夹结构:

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'
设置可执行标志 在Git中添加/删除文件的可执行标志可以通过多种方式完成,并且在某些情况下可能会出错(本答案末尾的示例)。最安全的方法是在工作目录和索引中显式更新它

下面是如何可靠地删除文件上的可执行标志(使用
+x
添加它):

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

在MacOS上,符号链接可以拥有权限,但Git无法跟踪它们。请务必注意,(在MacOS上)如果引用的文件未设置可执行标志,则无法使用可执行=true的符号链接执行链接文件

有问题的工作流 我曾看到开发人员犯过这样的错误:更改临时区域(索引)中的可执行文件标志,然后使用原始模式将文件重新添加到索引中。总体而言,未应用所需的更改

这不起作用(!):

在第一行之后,将模式更改为100644,正如我们预期的那样:

$ git diff --cached
diff --git a/test.sh b/test.sh
old mode 100755
new mode 100644
但是,工作目录中文件的模式没有更改,现在显示为未老化的更改(在暂存区域中,模式为100644):


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

是否在同一存储库中
name1.h
是否在同一存储库中?是的,它在同一存储库中。此外,我尝试删除符号链接,在没有执行权限的情况下再次创建它们,然后提交和推送。在我的系统的本地副本上,文件仍然作为不可执行文件可见,但在远程(bitbucket隐藏)上,它们具有执行权限。再次克隆回购协议时,执行权限也会出现在我的系统上。符号链接上的x位没有意义。符号链接在名称查找过程中被替换,除非您正在执行lstat()调用(或等效调用),并且符号链接是最后一个组件;然后使用符号链接目标上的权限。(至于Git本身,请参见下面Matt的回答:Git只存储对象是符号链接的事实,而不存储任何模式位。)@torek你说得对。这似乎是一个bitbucket隐藏问题,错误地显示符号链接的权限状态。
git update-index --chmod=-x test.sh
git add test.sh
git commit
$ git diff --cached
diff --git a/test.sh b/test.sh
old mode 100755
new mode 100644
$ git diff
diff --git a/test.sh b/test.sh
old mode 100644
new mode 100755