首页 文章

如何让Git忽略文件模式(chmod)的变化?

提问于
浏览
1971

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

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

11 回答

  • 49

    尝试:

    git config core.fileMode false
    

    来自git-config(1)

    core.fileMode
    告诉Git工作树中的文件的可执行位
    是值得尊敬的 .

    某个文件系统在文件丢失时丢失可执行位
    标记为可执行文件已签出,或签出
    具有可执行位的非可执行文件 . git的克隆(1)
    或者git-init(1)探测文件系统以查看它是否处理
    可执行位正确,这个变量是自动的
    根据需要设定 .

    但是,存储库可能位于处理的文件系统上
    filemode正确,并且此变量在设置为true时
    已创建,但稍后可能可以从另一个访问
    丢失文件模式的环境(例如导出ext4
    通过CIFS mount,使用Git访问Cygwin创建的存储库
    适用于Windows或Eclipse) . 在这种情况下,可能是必要的
    将此变量设置为false . 请参阅git-update-index(1) .

    默认值为true(未指定core.filemode时)
    在配置文件中) .

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

    git -c core.fileMode=false diff
    

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

    git config --global core.fileMode false
    

    警告

    core.fileMode 不是最佳做法,应谨慎使用 . 此设置仅涵盖模式的可执行位,而不包括读/写位 . 在许多情况下,您认为您需要此设置,因为您执行了类似 chmod -R 777 的操作,使您的所有文件都可执行 . 但在大多数项目中 most files don't need and should not be executable for security reasons .

    解决此类情况的正确方法是分别处理文件夹和文件权限,例如:

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

  • 14

    工作树中的undo模式更改:

    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
    
  • 14

    如果要为所有存储库设置此选项,请使用 --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
    
  • 118

    如果

    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
    

    你完成了!

  • 18

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

    您可以使用git update-index--chmod=(-|+)x 选项("git add"的低级版本)来更改索引中的执行权限,如果您使用"git commit"(而不是"git commit -a"),则从中获取该权限 .

  • 253

    您可以全局配置它:

    git config --global core.filemode false

    如果上述方法不适合您,原因可能是您的本地配置会覆盖全局配置 .

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

    git config --unset core.filemode

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

    git config core.filemode false

  • 3263

    如果您已经使用了 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 .

  • 2

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

  • 1

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

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

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

    git nfm status
    
  • 33

    Simple solution:

    在项目文件夹中点击 Simple commendit won`t remove your original changes) ...它只会 remove changes 当您更改 donedone

    推荐如下:

    git config core.fileMode false

    Why this all unnecessary file get modified: 因为您已通过推荐更改了项目文件夹权限 sudo chmod -R 777 ./yourProjectFolder

    你什么时候检查你做了什么?你在使用 git diff filename 时发现如下

    enter image description here

  • 67

    这对我有用:

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

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

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

相关问题