Dal*_*ter 260 git file-permissions file
我有一个git checkout.所有文件权限都不同于git认为应该是的权限,因此它们都显示为已修改.
在不触及文件内容的情况下(只想修改权限)如何将所有文件权限设置为git认为应该是什么?
muh*_*hqu 534
使用时,Git会跟踪文件许可并公开权限更改git diff -p.所以我们需要的是:
作为单线:
git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never \
| git apply
Run Code Online (Sandbox Code Playgroud)
你也可以把它作为你的git配置的别名添加...
git config --global --add alias.permission-reset '!git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'
Run Code Online (Sandbox Code Playgroud)
...你可以通过以下方式调用它:
git permission-reset
Run Code Online (Sandbox Code Playgroud)
注意,如果你是shell bash,请确保使用'而不是"引号!git,否则它将被git你运行的最后一个命令所取代.
感谢@Mixologic指出,只需使用-Ron git diff,sed就不再需要繁琐的命令了.
Tim*_*gan 108
尝试 git config core.fileMode false
注:git config是区分大小写的!
从core.fileMode手册页:
git config core.fileMode false如果为false,则忽略索引和工作副本之间的可执行位差异; 对像FAT这样的破碎文件系统很有用.请参阅git-update-index(1).
默认值为true,但git-clone(1)或git-init(1)将在创建存储库时探测并设置core.fileMode false.
Git不存储可执行脚本以外的文件权限.考虑使用git-cache-meta之类的东西来保存文件所有权和权限.
Git只能存储两种模式:755(可执行)和644(不可执行).如果您的文件是444 git将存储它有644.
git diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply
Run Code Online (Sandbox Code Playgroud)
在大多数情况下都可以使用,但是如果您安装了外部差异工具(如meld),则必须添加--no-ext-diff
git diff --no-ext-diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply
Run Code Online (Sandbox Code Playgroud)
在我的情况下是需要的