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

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

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

答案

尝试:

git config core.fileMode false

git-config(1)

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

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

git -c core.fileMode=false diff

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

git config --global core.fileMode false

全局设置的更改不会应用于现有存储库。此外, git clonegit init在回购配置中显式将core.fileMode设置为true ,如Git 全局 core.fileMode false 中所述在克隆上本地覆盖

警告

core.fileMode不是最佳实践,应谨慎使用。此设置仅覆盖 mode 的可执行位,不覆盖读 / 写位。在许多情况下,您认为您需要此设置,因为您执行了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

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

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 选项的情况下运行它,而您的工作目录不是存储库,则会得到

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

如果

git config --global core.filemode false

不适用于您,请手动执行以下操作:

cd into yourLovelyProject folder

cd 到. git 文件夹:

cd .git

编辑配置文件:

nano config

将 true 更改为 false

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

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

cd ..

重新初始化 git

git init

大功告成!

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

您可以使用git update-index (低级版本的 “git add”)的--chmod=(-|+)x选项来更改索引中的执行权限,如果使用 “git”,则将从该位置开始执行提交”(而不是 “git commit -a”)。

您可以全局配置它:

git config --global core.filemode false

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

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

git config --unset core.filemode

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

git config core.filemode false

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

新模式:755

旧模式:644

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

sudo chmod 644 .

现在可以使用命令或手动在配置文件中将 core.fileMode 设置为 false。

git config core.fileMode false

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

sudo chmod 755 .

并再次将 core.fileMode 设置为 true。

git config core.fileMode true

为了获得最佳实践,请不要始终将 core.fileMode 保持为 false。

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

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

当此别名作为 git 命令的前缀时,文件模式更改将不会与其他显示它们的命令一起显示。例如:

git nfm status

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

简单的解决方案:

在项目文件夹中单击此简单命令它不会删除您的原始更改) ... 它只会删除在更改项目文件夹权限时 所做的更改

命令如下:

git config core.fileMode 错误

为什么要修改所有这些不必要的文件:因为您已经通过推荐sudo chmod -R 777更改了项目文件夹权限。/yourProjectFolder

您什么时候会检查更改而不做?您在使用git diff filename时发现如下

old mode 100644
new mode 100755