如何让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标志将使其成为login用户的默认行为。

 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 ,除非在非常罕见的环境中。

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

 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 

编辑configuration文件:

 nano config 

变成真假

 [core] repositoryformatversion = 0 filemode = true 

– >

 [core] repositoryformatversion = 0 filemode = false 

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

 cd .. 

重新启动git

 git init 

你完成了!

添加到Greg Hewgill的答案 (使用core.fileModeconfigurationvariables):

你可以使用--chmod=(-|+)x选项的git update-index (低级版本的“git add”)来改变索引中的执行权限,如果你使用“git提交“(而不是”git commit -a“)。

您可以在全局进行configuration:

git config --global core.filemode false

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

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

git config --unset core.filemode

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

git config core.filemode false

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

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

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

当这个别名是git命令的前缀时,文件模式的变化将不会显示出来,否则会显示它们的命令。 例如:

 git nfm status 

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

新模式:755

旧模式:644

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

sudo chmod 644 .

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

 git config core.fileMode false 

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

 sudo chmod 755 . 

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

 git config core.fileMode true 

对于最佳做法,不要始终保持core.fileMode为false。