我有一个git结帐。所有的文件权限都不同于git认为它们应该是什么,因此它们都显示为修改。

没有触及文件的内容(只是想修改权限),我如何设置所有文件的权限,git认为他们应该是什么?


当前回答

我遇到了类似的问题,有人在服务器上的所有文件中添加了可执行标志,但是我也有本地修改的文件,除了那些权限被破坏的文件。然而,由于git唯一跟踪的权限是可执行标志,这个管道为我解决了这个问题:

git status | grep 'modified:' | awk '{print $3}' | xargs chmod a-x

基本上,该命令运行git status,过滤作为修饰符报告的文件,通过awk提取它们的路径,并删除可执行标志。

其他回答

Git不存储除可执行脚本以外的文件权限。考虑使用git-cache-meta之类的工具来保存文件所有权和权限。

Git只能存储两种模式:755(可执行)和644(不可执行)。如果你的文件是444,git会存储它的644。

我在Windows上使用cygwin的git, git应用解决方案不适合我。这是我的解决方案,在每个文件上运行chmod来重置其权限。

#!/bin/bash
IFS=$'\n'
for c in `git diff -p |sed -n '/diff --git/{N;s/diff --git//g;s/\n/ /g;s# a/.* b/##g;s/old mode //g;s/\(.*\) 100\(.*\)/chmod \2 \1/g;p}'`
do
        eval $c
done
unset IFS

我遇到了类似的问题,有人在服务器上的所有文件中添加了可执行标志,但是我也有本地修改的文件,除了那些权限被破坏的文件。然而,由于git唯一跟踪的权限是可执行标志,这个管道为我解决了这个问题:

git status | grep 'modified:' | awk '{print $3}' | xargs chmod a-x

基本上,该命令运行git status,过滤作为修饰符报告的文件,通过awk提取它们的路径,并删除可执行标志。

最简单的方法就是把权限改回来。正如@kroger指出的,git只跟踪可执行位。所以你可能只需要运行chmod -x文件名来修复它(或者如果需要的话+x)。

试试git的config core。fileMode假

从git配置手册页:

core.fileMode 如果为false,则忽略索引和工作副本之间的可执行位差异;对FAT等损坏的文件系统很有用。看到git-update-index(1)。 默认为true,除非git-clone(1)或git-init(1)将探测和设置core。在创建存储库时,fileMode为false(如果合适)。