【问题标题】:How to add chmod permissions to file in Git?如何在 Git 中为文件添加 chmod 权限?
【发布时间】:2017-04-20 02:55:05
【问题描述】:

我想 git 提交一个 .sh 文件,但希望它在我在另一台服务器上签出同一个文件时可执行。

有没有办法在签出文件的服务器中不手动 chmod u+x 该文件?

【问题讨论】:

    标签: git


    【解决方案1】:

    根据official documentation,您可以使用update-index 子命令设置或删除任何跟踪文件上的“可执行”标志。

    要设置标志,请使用以下命令:

    git update-index --chmod=+x path/to/file
    

    要删除它,请使用:

    git update-index --chmod=-x path/to/file
    

    幕后

    虽然这看起来像常规的 unix 文件权限系统,但实际上并非如此。 Git 为其内部存储中的每个文件维护一个特殊的“模式”:

    • 100644 用于常规文件
    • 100755 用于可执行文件

    您可以使用ls-file 子命令和--stage 选项将其可视化:

    $ git ls-files --stage
    100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
    100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh
    

    默认情况下,当您将文件添加到存储库时,Git 将尝试尊重其文件系统属性并相应地设置正确的文件模式。您可以通过将core.fileMode 选项设置为 false 来禁用此功能:

    git config core.fileMode false
    

    疑难解答

    如果在某些时候未设置 Git 文件模式但文件具有正确的文件系统标志,请尝试删除模式并重新设置:

    git update-index --chmod=-x path/to/file
    git update-index --chmod=+x path/to/file
    

    奖金

    从 Git 2.9 开始,您可以暂存文件并在一个命令中设置标志:

    git add --chmod=+x path/to/file
    

    【讨论】:

    • 当我对 test.sh、git commit 和 push 以及在另一台服务器中签出执行此操作时,这些是该文件的权限:-rw-rw-r-- 1 user user 12 Dec 5 11:42 test.sh
    • 我刚刚在我的一个存储库上执行了测试,它按预期工作。在 Windows 下使用提供的命令对文件设置权限。在我的一台服务器(Debian)上,该文件之前具有 -rw-r--r-- 权限,现在设置为 -rwxr-xr-x。你在本地和远程机器上使用什么 git 版本?
    • 我本地的 git 版本 1.9.5,服务器中的 git 1.7.1 进行结帐。
    • 刚刚尝试使用 git 1.7.10 在另一台(旧)服务器上克隆,它仍然运行良好,文件具有 x 权限。也许您在某些时候犯了错误,或者您在远程服务器上克隆的用户存在权限问题
    • 请注意,您只能更改(设置或清除)执行权限。 Git 不跟踪任何其他权限(例如读取或写入权限)。
    【解决方案2】:

    Antwane's answer 是正确的,这应该是一个注释,但是 cmets 没有足够的空间并且不允许格式化。 :-) 我只想在 Git 中补充一点,文件权限1 记录为644755(拼写为(100644 和@987654327 @; 100 部分表示“常规文件”):

    diff --git a/path b/path
    new file mode 100644
    

    前者——644——意味着文件应该是可执行的,而后者意味着它应该是可执行的。这在文件系统中如何变成实际的文件模式在某种程度上取决于操作系统。在类 Unix 系统上,这些位通过您的 umask 设置传递,通常是 022 以删除“组”和“其他”的写权限,或 002 仅删除“其他”的写权限.如果您特别关心隐私并希望从“组”和“其他”中删除读取、写入和执行权限,也可能是 077


    1Git 的极早期版本保存了组权限,因此某些存储库中包含模式为 664 的树条目。现代 Git 不会,但由于任何对象的任何部分都无法更改,因此这些旧权限位仍然存在于旧树对象中。

    仅存储 0644 或 0755 的更改是在提交 e44794706eeb57f2 中进行的,这是在 Git v0.99 之前,日期为 2005 年 4 月 16 日。

    【讨论】:

    • “Git 的早期版本”知道哪些确切版本会受此影响吗?
    • @user5359531 提交之前的版本e44794706eeb57f2ee38ed1604821aa38b8ad9d2,即早于 Git 版本 0.99。
    • 也许尝试重新上传 git 存储库。
    【解决方案3】:

    为存储库中的所有文件设置可执行标志:

    git ls-files --stage |grep 100644 | cut -f2 | xargs -d '\n' git update-index --chmod=+x
    

    要取消所有文件的可执行标志,请执行相反的操作

    git ls-files --stage | grep 100755 | cut -f2 | xargs -d '\n' git update-index --chmod=-x
    

    ...并设置所有.sh-scripts 可执行文件,也许这是你的方式:

    git ls-files --stage | grep  ".sh$" | cut -f2 | xargs -d '\n' git update-index --chmod=+x
    

    【讨论】:

      【解决方案4】:

      在 linux 上,别忘了

      set sudo chmod +x /path/to/file
      

      在本地进行 git 更新,否则 git 将始终将索引恢复到本地机器上默认设置的 644 !

      在 Windows Powershell 中,您可以使用

      icacls .\path\to\file /grant Everyone:F
      

      【讨论】:

      • 在 PowerShell 中你会做 icacls .\path\to\file /grant Everyone:F
      • @H0R5E TY 建议在我的回答中编辑,我把它放进去
      • 根据要求建议编辑!
      猜你喜欢
      • 2011-09-06
      • 1970-01-01
      • 2012-11-24
      • 2016-04-06
      • 2013-11-30
      • 2014-03-04
      • 2016-01-20
      • 1970-01-01
      • 2019-03-10
      相关资源
      最近更新 更多