我有一个git结帐。所有的文件权限都不同于git认为它们应该是什么,因此它们都显示为修改。
没有触及文件的内容(只是想修改权限),我如何设置所有文件的权限,git认为他们应该是什么?
我有一个git结帐。所有的文件权限都不同于git认为它们应该是什么,因此它们都显示为修改。
没有触及文件的内容(只是想修改权限),我如何设置所有文件的权限,git认为他们应该是什么?
当前回答
谢谢@muhqu的精彩回答。在我的例子中,并不是所有的更改文件都更改了权限,这阻止了命令的工作。
$ git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never
diff --git b/file1 a/file1
diff --git b/file2 a/file2
old mode 100755
new mode 100644
$ git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply
warning: file1 has type 100644, expected 100755
然后补丁将停止,文件将保持不变。
如果有人有类似的问题,我通过调整命令来解决这个问题,只有权限更改文件:
grep -E "^old mode (100644|100755)" -B1 -A1
或者git别名
git config --global --add alias.permission-reset '!git diff -p -R --no-ext-diff --no-color | grep -E "^old mode (100644|100755)" -B1 -A1 --color=never | git apply'
其他回答
我知道这很古老,但我来自谷歌,我没有找到答案
如果你没有零钱想留着,我有一个简单的解决办法:
git config core.fileMode true
git reset --hard HEAD
etckeeper工具可以处理权限和:
etckeeper init -d /mydir
你可以把它用在其他地方,而不是/等等。
使用你的包管理器安装或从上面的链接获取源代码。
你也可以尝试一个前/后结帐挂钩。
参见:自定义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。