在Windows上的Git文件权限

254

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

$ 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

我曾尝试更改文件权限,但这并不会改变差异结果。

7个回答

491

10
+1:这正是我需要的,以确保我从 Windows 提交的 shell 脚本(其中我将 core.filemode 设置为 false)实际上具有可执行位。 - tomlogic
10
在Windows中,使用git-bash时,出于某种原因,我需要在执行命令时添加一个--add标志:git update-index --add --chmod=+x <file>。之后,这个文件已经被加入到暂存区,并且权限已经更改。 - Jefferson Quesado
1
在Git Bash和cmd.exe提示符中都不再起作用。 - Ben
3
@Ben,你也需要记住,在没有确定的情况下,不要说出像“已经没有效果了”这样的话。 - Erdal G.
当时我绝对确定了。我记得执行了“git reset --hard”,但仍然看到文件模式的修改。这让我感到非常烦恼,因为它阻碍了我当时尝试进行的任何基本的git操作。我尝试了这个解决方案,但完全没有用。但是我无论如何都想不起来我当时正在工作的存储库是什么,它是什么类型的文件系统,或者我最终是如何解决它的。 - Ben
显示剩余5条评论

154

以下内容来源于stackoverflow的另一个问题:如何让Git忽略文件模式(chmod)更改?

首先查看core.filemode设置为什么 -

git config core.filemode

尝试将其设置为 false:

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.

1
谢谢。我也看到了。尝试过了,但没有任何改变。 - Synesso
4
我遇到了与原帖作者类似的问题,尝试了很多次重置却仍然无法获取更改。但是这个方法对我起了作用。 - Jo-Herman Haugholt
16
[project]/.git/config可能包含相同的设置并且将覆盖~/.gitconfig。如果您正在尝试全局设置,请确保它没有被本地覆盖。 - Binary Phile
6
很遗憾,在NTFS上我发现这也是必要的。 - Marc.2377
3
那就是答案! - Andrei Surdu
显示剩余2条评论

39

Git Bash实用的一行命令:

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

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


1
最好避免使用xargs(有关原因的更详细说明,请参见此处)。请尝试:find . -name '*.sh' -type 'f' -exec git update-index --chmod=+x {} +。这将为find找到的每个文件执行该命令。 - Bruno Saboia

24
如果您使用Cygwin Git(或Linux Git),则很可能已经在$projdir/.git/config中的项目级别上设置了core.filemode设置。我发现,为了使我的Cygwin Git和Windows Git在Windows文件系统上能够良好地共存而不会出现不存在的文件模式更改,我必须执行以下操作:
  • 删除$projdir/.git/config中设置core.filemode的行
  • 在Windows Git中运行“git config --global core.filemode false”
这将允许我的Cygwin Git继续查看文件模式更改,这些更改通常是相关的,同时指示Windows Git忽略它看到的文件模式更改,这些更改通常是误报。

20

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

git ls-files --stage

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

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

现在重新验证权限。

git ls-files --stage

NB: 如果您正在运行Windows并部署到Linux,请确保存储库包含带有类Unix换行符的代码。要批量转换文件,可以尝试使用dos2unix.exe或在Git Bash中工作。


有没有办法做类似于 git update-index --chmod=1777 'scriptname.ext' 的操作? - Alex Barker
你是否导航到脚本文件所在的路径了?@alex - Sireesh Yarlagadda
感谢您展示如何检查权限。 - Livven

5

我通过更改Ubuntu中的文件权限来解决了这个问题,提交、推送,一切正常。看起来在Windows/NTFS上使用msysgit就行不通。


我可以推荐GitHub for Windows。界面非常好,外壳也很漂亮,我甚至可以相对容易地设置SSH密钥和安装Git Flow。 - Sangoku

0
在我的情况下,我不小心移动了shebang行,导致...
#! /bin/sh

成为

   #! /bin/sh

这会导致 git-bash 权限检查失败。 去掉前导空格后,脚本将再次可执行。


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