/ 前端

搬砖日常之——如何让git忽略文件权限更改?

当把别人的源代码pull到本地之后,我们可能会安装依赖,更改owner用户,然后将源代码或者编译输出的文件根据情况做一些权限变更。
在一顿操作猛如虎之后,你会发现,git将所有更改过权限的文件都标记了。
是不是一头雾水,一脸懵逼,脑瓜子嗡嗡地?
如果你胆子大的话,可以尝试一下直接commit上去,可能等会儿就会有不少人举着椅子来找你聊天了。

不挨打的办法很简单:

git config core.fileMode false

这样git将会忽略文件权限的改动咯,又可以开心地在dev环境玩耍了。

作为一个好奇心重的搬砖工,这肯定满足不了我的求知欲啊,首先看一下文档是这么说的:

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).

也可以用--global属性来设置默认值为false.

Warning

虽然看上去貌似省了不少事情,但还请各位适可而止,不要滥用。毕竟config.filemode这个属性仅仅cover了可执行bit位的,也就是说,不包括read/write比特位。
而且大多数情况下,大多数人之所以用到这个,就是因为图省事,用了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

这样一来,文件夹和文件的权限就分开了,绝大多数情况下,都不需要更改git配置了。

Undo

有时候,可能你并不想更改文件权限而引起git暴乱,这时候脑瓜子先别着急嗡嗡地,事情是可以还原的:

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

可以将mode change复原,然后该干啥继续呗。

搬砖日常之——如何让git忽略文件权限更改?
Share this