网上找到的 chmod 777 只是临时的解决方案,那么要怎样在 git 中上传具有执行权限的脚本呢

如何会遇到这样的问题

以前开发 sh 脚本的时候都会直接在 mac 上开发,近期由于疫情原因,工作转变为了远程办公,因此开发工作便转移到了自己随身设备 windows 上,然而开发完成之后,通过 git 上传,然后准备在 mac 上执行的时候,问题来了。
终端直接给我提示了一句

1
-bash: ./******.sh: Permission denied

然后满脑子问号什么情况
直接查询下权限

1
ls -l

告诉我我脚本的权限都长这样了 -rw-r--r--

这怎么就没有执行权限了
虽然可以临时通过的方法提升权限,但是不能这么搞啊,脚本一多不得累死嘛

1
sudo chmod 755 ****.sh

产生原因

我们在 Windows 下做开发有时会写在 linux 或者 mac 上运行的脚本,这个脚本默认是没有执行权限的。╮(╯▽╰)╭
在 windows 上进入脚本目录打开 git bash

1
git ls-tree HEAD

可以看到我们刚才上传的代码都是没有执行权限的,如果有执行权限应该是显示 100755

1
2
3
4
100644 blob f5846e262e2e1a4b24fbe01548ecb1b9afbc6a21    ******.sh
100644 blob 41ee33298d7a1bf035a75aht6d4abd23ef102b9f ****.sh
100644 blob cdd962d57d8396c954cc2c2bch870dfa8421d1aa *****.sh
100644 blob 6e058b2e3d4475655jh79af43e65a63bf5562661 ******.sh

如何解决

我们现在需要在 windows 上提升好权限再上传到 git 上去,以便使用

① 打开 git bash

② 修改 sh 脚本的权限

1
git update-index --chmod=+x ******.sh

③ 提交修改,并推送

1
git commit -m "revise permission access"
1
2
3
2 files changed, 1 insertion(+), 1 deletion(-)
mode change 100644 => 100755 ******.sh
mode change 100644 => 100755 *****.sh

④ 然后再查看权限的时候就会发现,权限都已经提升好了

1
git ls-tree HEAD
1
2
3
4
100755 blob f5846e262e2e1a4b24fbe01548ecb1b9afbc6a21    ******.sh
100755 blob 41ee33298d7a1bf035a75aht6d4abd23ef102b9f ****.sh
100755 blob cdd962d57d8396c954cc2c2bch870dfa8421d1aa *****.sh
100755 blob 6e058b2e3d4475655jh79af43e65a63bf5562661 ******.sh

网上其他说法

在 *.sh 脚本头部加上 Shebang ( #!/bin/sh 或者 #!/bin/bash )
添加 #!/bin/sh 之后在 windows 上的 git bash 中变为可执行,但到 linux 上依然不可执行

综上所述

在 windows 上写执行于 linux 上的 sh 脚本时,需要先 commit 脚本文件,然后在 git 中提升脚本的执行权限,最后再进行 push 操作