协慌网

登录 贡献 社区

如何让 Git 忽略文件模式(chmod)的变化?

我有一个项目,我必须在开发时将chmod的文件模式更改为 777,但在主仓库中不应该更改。

Git 选择了chmod -R 777 .并将所有文件标记为已更改。有没有办法让 Git 忽略对文件进行的模式更改?

答案

尝试:

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.

-c标志可用于为一次性命令设置此选项:

git -c core.fileMode=false diff

并且--global标志将使其成为登录用户的默认行为。

git config --global core.fileMode false

警告

core.fileMode不是最佳实践,应谨慎使用。此设置仅涵盖模式的可执行位,而不包括读 / 写位。在许多情况下,您认为您需要此设置,因为您执行了类似chmod -R 777 ,使您的所有文件都可执行。但是在大多数项目中, 出于安全原因,大多数文件不需要也不应该是可执行的

解决此类情况的正确方法是分别处理文件夹和文件权限,例如:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

如果你这样做,你将永远不需要使用core.fileMode ,除非在非常罕见的环境中。

工作树中的 undo 模式更改:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

或者在 mingw-git 中

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

如果要为所有存储库设置此选项,请使用--global选项。

git config --global core.filemode false

如果这不起作用,您可能正在使用更新版本的 git,请尝试使用--add选项。

git config --add --global core.filemode false

如果你在没有 --global 选项的情况下运行它并且你的工作目录不是 repo,你就会得到

error: could not lock config file .git/config: No such file or directory