在Windows 7上使用git-bash更新文件权限

71

如何在Windows 7上使用git-bash更新文件权限?

我尝试了以下方法,但都没有成功:

$ ls -al scripts/script.sh
-rw-r--r--    1 myUid   Administ       70 Sep  8 11:24 scripts/script.sh

$ git update-index --chmod=+x scripts/script.sh

$ ls -al scripts/script.sh
-rw-r--r--    1 myUid   Administ       70 Sep  8 11:24 scripts/script.sh

$ chmod +x scripts/script.sh

$ ls -al scripts/script.sh
-rw-r--r--    1 myUid   Administ       70 Sep  8 11:24 scripts/script.sh
3个回答

101
您可能正在Windows上使用NTFS或FAT32,这些文件系统不支持可执行权限。相反,cygwin会查看文件名和内容来确定它是否可执行

如果文件名以.bat、.com或.exe结尾,或者其内容以#!开头,则认为文件是可执行的。

因此,您应该确保bash文件以shebang开头(例如:#!/bin/bash)。然后,您应该能够仅执行该文件,而忽略ls的权限输出。

4
什么是shebang?shebang是一行位于Unix/Linux脚本文件开头的特殊注释,它指示操作系统应使用哪个解释器来执行该脚本。通常以 #! 开始,后面跟着解释器的路径。 - Black
5
@EdwardBlack 有些类似于 #/bin/bash 的东西,我已经相应地澄清了问题。 - Yogu
1
那么.CMD呢? :-) - Doug P

61

如果您正在Windows环境中更新脚本,并将其部署到Linux文件系统中,即使它们被允许在本地运行,您可能仍然需要在推送之前授予执行权限。

从这篇文章(Change file permissions when working with git repo's on windows)中得知:

  1. 打开类似于Git Bash的Bash终端
  2. 导航到要授予执行权限的.sh文件所在的位置
  3. 使用以下命令检查现有权限:

    git ls-files --stage 
    
  4. 执行以下命令更新权限,应该返回类似于100644的东西

  5. 使用以下命令更新权限

  6. git update-index --chmod=+x 'name-of-shell-script'
    
  7. 再次检查文件权限

    git ls-files --stage 
    

    应该返回类似于100755的内容

  8. 提交更改并推送!

Windows上的Git Bash


有帮助的回答。你能告诉我你用来分隔Git Bash窗口的软件是什么吗? - Lahiru Chandima
2
@LahiruChandima,Windows Terminal - 非常推荐。 - KyleMit
1
这正是我在寻找的答案。在我的情况下,git ls-files --stage 显示它们已经是 644,而 MSYS 正在通过启发式方法将其中一些标记为可执行文件。 - studog

10
很可能你的脚本开头没有"shebang"。因此,Windows不知道应该使用哪个二进制文件来运行脚本。因此权限被静默忽略。
例如:
#!/usr/bin/sh

或者
#!/usr/bin/bash

看起来git-bash会自动检测它,因为即使没有使用chmod命令,可执行属性也会被设置。此外,使用chmod也无法禁用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接