问题描述

我有一个项目,我必须在开发过程中将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 . -t d -exec chmod a+rwx ; # Make folders traversable and read/write
find . -t 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选项,您的工作目录不是一个repo,你会得到

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

更改为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 commit”(而不是“git commit”一个”)。

第六种方案

您可以在全局配置:

git config --global core.filemode false

如果上述不适用于您,原因可能是您的本地配置覆盖全局配置。

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

git config --unset core.filemode

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

git config core.filemode false

第七种方案

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

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/'

第九种方案

如果您已经使用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永久保留。

参考文献