【问题标题】:Git file permissions on WindowsWindows 上的 Git 文件权限
【发布时间】:2011-09-22 12:30:24
【问题描述】:

我已经阅读了一些关于 Git 中文件权限的问题,但我仍然有点困惑。我在 GitHub 上有一个从另一个分叉而来的仓库。合并后,它们应该是相同的。然而:

$ git diff --summary origin/epsilon master/epsilon
 mode change 100644 => 100755 ants/dist/sample_bots/csharp/compile.sh
 mode change 100644 => 100755 ants/dist/starter_bots/coffeescript/MyBot.coffee
 mode change 100644 => 100755 ants/dist/starter_bots/coffeescript/ants.coffee
 mode change 100644 => 100755 ants/util/block_test.sh
 mode change 100644 => 100755 manager/mass_skill_update.py
 mode change 100644 => 100755 worker/jailguard.py
 mode change 100644 => 100755 worker/release_stale_jails.py
 mode change 100644 => 100755 worker/start_worker.sh

我已尝试更改文件权限,但它不会改变差异结果。

【问题讨论】:

    标签: windows git diff file-permissions


    【解决方案1】:

    在我的例子中,我不小心移动了 shebang 线,所以

    #! /bin/sh
    
    

    成为

       #! /bin/sh
    

    这会导致 git-bash 权限检查失败。 删除前导空格后,脚本再次变为可执行。

    【讨论】:

      【解决方案2】:

      首先使用以下命令检查文件权限。

      git ls-files --stage
      

      然后更改权限。这里的“x”代表执行权限。

      git update-index --chmod=+x 'scriptname.ext'
      

      现在重新验证权限。

      git ls-files --stage

      ===============================================

      如果您使用的是 Windows PC,但部署在 linux 机器上。首先执行以下命令,使其兼容在linux机器上运行

      dos2unix scriptname.ext scriptname.ext

      【讨论】:

      • 有没有办法像git update-index --chmod=1777 'scriptname.ext'那样做?
      • 您是否导航到脚本文件所在的路径? @亚历克斯
      • 感谢您展示如何检查权限。
      【解决方案3】:

      如果您使用 Cygwin git(或者我认为也是 Linux git),您的 core.filemode 设置很有可能已在 $projdir/.git/config 的项目级别设置。我发现我必须执行以下操作才能让我的 Cygwin git 和我的 Windows git 在 Windows 文件系统上很好地共存,而不会一直显示不存在的文件模式更改:

      • 删除$projdir/.git/config中设置core.filemode这一行
      • 在 Windows git 中,运行“git config --global core.filemode false”

      这允许我的 Cygwin git 继续查看通常相关的文件模式更改,同时指示 Windows git 忽略它看到的文件模式更改,这通常是误报。

      【讨论】:

        【解决方案4】:

        Git Bash 的便捷单行:

        find . -name '*.sh' | xargs git update-index --chmod=+x
        

        它将所有.sh 文件标记为可执行文件。 之后,您只需git commit

        【讨论】:

        • 对@benoit-blanchon one-liner 的小修正... .sh 必须被引用。找 。 -name '.sh' | xargs git update-index --chmod=+x
        • 你说得对,我编辑了答案。谢谢@SteventheEasilyAmused。
        • 最好避免使用xargs(关于为什么可以找到更深入的解释here)。请尝试:find . -name '*.sh' -type 'f' -exec git update-index --chmod=+x {} +。这将为find 找到的每个文件执行命令。
        【解决方案5】:

        我在这里找到了如何在 Windows 上更改权限的解决方案:http://blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html

        例如以下命令将用户执行权限添加到任意文件:

        git update-index --chmod=+x <file>
        

        【讨论】:

        • +1:正是我需要确保我从 Windows 提交的 shell 脚本(我将 core.filemode 设置为 false)确实设置了执行位。
        • 在我的情况下,我还在文件中添加了一个新行,然后才能够提交
        • 在 Windows 中,使用 git-bash,出于某种原因,我需要一个 --add 标志来执行:git update-index --add --chmod=+x &lt;file&gt;。在此之后,该文件已经在阶段与 chmod
        • 已经没有效果了,无论是在 git bash 还是在 cmd.exe 提示符下。
        • @Ben 你还需要记住不要在不确定的情况下说“已经没有效果了”之类的话?
        【解决方案6】:

        来自stackoverflow上的另一个问题: How do I make Git ignore file mode (chmod) changes?

        试试:

        git config core.filemode false
        

        来自git-config(1)

           core.fileMode
               If false, the executable bit differences between the index and the
               working copy are ignored; useful on broken filesystems like FAT.
               See git-update-index(1). True by default.
        

        【讨论】:

        • 谢谢。我也看到了。试过了,没什么区别。
        • 我遇到了与 OP 类似的问题,无论hard 我如何尝试重置,都无法进行更改。这对我有用。
        • [project]/.git/config 可能包含相同的设置并将覆盖 ~/.gitconfig。如果您尝试在全局范围内设置它,请确保它没有在本地被覆盖。
        • 遗憾的是,我发现这在 NTFS 上也是必要的。
        • 这就是答案!
        【解决方案7】:

        我通过更改 Ubuntu 中的文件权限、提交、推送和一切正常来修复它。似乎它不适用于 Windows/NTFS 上的 msysgit。

        【讨论】:

        • 我推荐 GitHub for windows。美妙的界面和非常好的外壳,我什至使 ssh 密钥设置和 git flow 安装变得相对简单。
        猜你喜欢
        • 2019-01-17
        • 2019-06-13
        • 2012-01-10
        • 2014-11-02
        • 1970-01-01
        • 2023-04-01
        • 2015-02-27
        • 2014-03-08
        • 1970-01-01
        相关资源
        最近更新 更多