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

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


当前回答

Git会跟踪文件权限,并在使用Git diff -p创建补丁时公开权限更改。所以我们只需要:

创建反向补丁 只包括权限更改 将补丁应用到我们的工作副本

一句话:

git diff -p -R --no-ext-diff --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

你也可以把它作为一个别名添加到你的git配置…

git config --global --add alias.permission-reset '!git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

...你可以通过以下方式调用它:

git permission-reset

注意,如果shell是bash,请确保在!git周围使用'而不是'引号,否则它将被您运行的最后一个git命令替换。

感谢@Mixologic指出,只要在git diff上使用-R,就不再需要繁琐的sed命令了。

其他回答

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

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

最简单的方法就是把权限改回来。正如@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(如果合适)。

你也可以尝试一个前/后结帐挂钩。

参见:自定义Git - Git钩子

Git会跟踪文件权限,并在使用Git diff -p创建补丁时公开权限更改。所以我们只需要:

创建反向补丁 只包括权限更改 将补丁应用到我们的工作副本

一句话:

git diff -p -R --no-ext-diff --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

你也可以把它作为一个别名添加到你的git配置…

git config --global --add alias.permission-reset '!git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

...你可以通过以下方式调用它:

git permission-reset

注意,如果shell是bash,请确保在!git周围使用'而不是'引号,否则它将被您运行的最后一个git命令替换。

感谢@Mixologic指出,只要在git diff上使用-R,就不再需要繁琐的sed命令了。