如何让Git忽略文件模式(chmod)更改?

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

Git在chmod -R 777 .上拾取并将所有文件标记为已更改。有没有办法让Git忽略对文件所做的模式更改?

1293566 次浏览

尝试:

git config core.fileMode false

g it-配置(1)

core.fileModeTells Git if the executable bit of files in the working treeis to be honored.
Some filesystems lose the executable bit when a file that ismarked as executable is checked out, or checks out anon-executable file with executable bit on. git-clone(1)or git-init(1) probe the filesystem to see if it handles theexecutable bit correctly and this variable is automaticallyset as necessary.
A repository, however, may be on a filesystem that handlesthe filemode correctly, and this variable is set to true whencreated, but later may be made accessible from anotherenvironment that loses the filemode (e.g. exporting ext4via CIFS mount, visiting a Cygwin created repository with Gitfor Windows or Eclipse). In such a case it may be necessaryto set this variable to false. See git-update-index(1).
The default is true (when core.filemode is not specifiedin the config file).

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

git -c core.fileMode=false diff

键入-c core.fileMode=false可能会很麻烦,因此您可以为所有git仓库设置此标志,或者仅为一个git仓库设置此标志:

# this will set your the flag for your user for all git repos (modifies `$HOME/.gitconfig`)# WARNING: this will be override by local config, fileMode value is automatically selected with latest version of git.# This mean that if git detect your current filesystem is compatible it will set local core.fileMode to true when you clone or init a repository.# Tool like cygwin emulation will be detected as compatible and so your local setting WILL BE SET to true no matter what you set in global setting.git config --global core.fileMode false
# this will set the flag for one git repo (modifies `$current_git_repo/.git/config`)git config core.fileMode false

此外,git clonegit init在repo配置中显式将core.fileMode设置为true,如Git全局core.file模式false在克隆上本地覆盖所述

警告

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

解决这种情况的正确方法是分别处理文件夹和文件权限,如下所示:

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

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

添加到Greg Hewgill的回答(使用core.fileMode配置变量):

您可以使用更新时间git update-index--chmod=(-|+)x选项(“git add”的低级版本)来更改索引中的执行权限,如果您使用“git提交”(而不是“git提交-a”),它将从那里获取。

撤消工作树中的模式更改:

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

或者在明格特

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

或在BSD/macOS中

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

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

git config --global core.filemode false

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

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

如果您在没有--global选项的情况下运行它,并且您的工作目录不是存储库,您将获得

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

如果您想在配置文件中递归地将filemode设置为false(包括子模块):find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'

如果

git config --global core.filemode false

不适合您,请手动执行:

cd into yourLovelyProject folder

cd到. git文件夹:

cd .git

编辑配置文件:

nano config

将true改为false

[core]repositoryformatversion = 0filemode = true

->

[core]repositoryformatversion = 0filemode = false

保存,退出,转到上面的文件夹:

cd ..

恢复git

git init

你完蛋了!

您可以全局配置它:

git config --global core.filemode false

如果上述方法对您不起作用,原因可能是您的本地配置覆盖了全局配置。

删除您的本地配置以使全局配置生效:

git config --unset core.filemode

或者,您可以将本地配置更改为正确的值:

git config core.filemode false

通过定义以下别名(在~/. gitconfig中),您可以轻松地暂时禁用每个git命令的fileMode:

[alias]nfm = "!f(){ git -c core.fileMode=false $@; };f"

当此别名以git命令为前缀时,文件模式更改将不会显示本来会显示它们的命令。例如:

git nfm status

如果您已经使用chmod命令,则检查文件的差异,它显示以前的文件模式和当前文件模式,例如:

新模式:755

旧模式:644

使用下面的命令设置所有文件的旧模式

sudo chmod 644 .

现在使用命令或手动将配置文件中的core.file模式设置为false。

git config core.fileMode false

然后应用chmod命令更改所有文件的权限,例如

sudo chmod 755 .

并再次将core.file模式设置为true。

git config core.fileMode true

对于最佳实践,不要总是保持core.file模式为假。

简单的解决方案:

在项目文件夹中点击这个简单的命令它不会删除您的原始更改)…它只会删除更改在您更改项目文件夹权限时一直是完成

命令如下:

git configcore.file模式false

为什么所有这些不必要的文件都会被修改:因为您更改了项目文件夹权限以赞扬sudo chmod-R 777./your ProjectFolder

你什么时候会检查你没有做的更改?使用git diff文件名

时发现如下
old mode 100644new mode 100755

这对我有用:

find . -type f -exec chmod a-x {} \;

或反向,取决于您的操作系统

find . -type f -exec chmod a+x {} \;

这可能有效:git config core.fileMode false

您不需要更改配置文件。

只需运行:

git diff -G.

请注意,尾随点不是句子的结尾,而是匹配所有内容的regex表达式,并且必须包含在内。

如果您设置:sudo chmod 777 -R

您可以运行:git config core.fileMode false

您可以查看:https://www.w3docs.com/snippets/git/how-to-make-git-ignore-file-mode-changes.html