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

在...创建的问题 Wed, Jun 11, 2014 12:00 AM

我有一个项目,我必须在开发时将chmod到777的文件模式更改,但主回购时不应该更改。

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

    
2090
  1. 在Windows上的Ubuntu上使用Windows + Bash上的git时这很有用
    2017-01-05 19:50:20Z
  2. 对于那些只想忽略git diff特定调用的权限更改,并且因此不想更改其Git配置文件的人:您可以使用git diff -G.每 Zed的回答此处
    2018-05-31 14:19:21Z
  3. 醇>
    11答案                              11 跨度>                         

    尝试:

     
    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 init。这对现有存储库是安全的。它不会覆盖已存在的东西。

    警告

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

        
    3469
    2019-06-27 07:11:36Z
    1. 如果你做了git config --global core.filemode false,你只需要为所有回购做一次。
      2012-10-21 20:05:05Z
    2. 这对我来说不起作用,直到我修复了它应该是fileMode而不是filemode
      2012-10-31 10:02:51Z
    3. @ tishma:Git配置部分和变量名称是根据文档不区分大小写,请参阅配置文件部分,如果上述内容对您不起作用,那么原因不同。
      2012-10-31 18:24:04Z
    4. @ donquixote:git config命令将设置写入正确的配置文件(仅当前存储库为.git/config,如果与~/.gitconfig一起使用,则为--global)。
      2013-11-27 21:15:40Z
    5. @ zx1986:没关系。从 git config :“变量名称不区分大小写,...” /DIV>
      2015-05-23 07:03:52Z
      醇>

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

       
      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
      
          
      259
      2011-05-16 14:58:42Z
      1. 在OS X Lion上,省略-d'\n'中的xargs部分,因为这是非法参数(并且不需要)。
        2011-06-16 20:07:24Z
      2. 你可以忽略任何关于“chmod:在'+ x'之后缺少操作数”的错误
        2011-07-08 22:03:10Z
      3. 这是最新的吗?我在mingw
        中得到'chmod:太少的论点'
        2012-03-23 18:18:06Z
      4. @ Pascal @pimlottc -d指定分隔符为换行符而不是任何空格。 BSD xargs没有该选项,但您可以通过tr '\n' '\0'管道输出,然后使用-0 arg到xargs使用NUL作为分隔符。
        2013-06-12 17:42:20Z
      5. 酷,tr的功能!这是OSX的完整命令:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
        2015-04-23 17:47:11Z
      6. 醇>

      如果要为所有存储库设置此选项,请使用--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
      
          
      125
      2015-04-19 20:12:00Z
      1. 在git版本1.7.9.6(Apple Git-31.1)上对我不起作用
        2013-01-12 13:39:11Z
      2. 看起来后来GIT使用--add,如git config --add --global core.filemode false
        2013-04-04 10:56:49Z
      3. 如果repo的本地配置已经有filemode = true,那么更改全局配置将无济于事,因为本地配置将覆盖全局配置。将不得不改变机器的每个repo的本地配置
        2015-07-09 19:40:15Z
      4. 请:用syedrakib的警告更新这个答案!在我找到它之前,一切都感到疯狂,并在之后变得非常有意义。
        2016-03-01 20:43:53Z
      5. 醇>

      如果

       
      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
      

      你完成了!

          
      73
      2013-08-06 13:10:3​​3Z
      1. 而不是编辑.git/config,项目根目录中的简单git config core.fileMode false就足够了。如果您编辑配置文件,则最好完全删除该指令,以便拾取全局指令。
        2014-01-13 12:50:27Z
      2. - 1如果git config --global不起作用,则表示您没有权限在系统级别执行此操作,删除global选项确实完成了与手动编辑.git /c相同onfig
        2014-04-10 07:57:35Z
      3. @ CharlesB不正确 - 答案提供了一种解决方法,将选项直接放在项目中,使其成为项目特定的。这不适用于您将来制作/结帐的其他git项目,但适用于您正在处理的项目。 (让我们确保消除歧义~/.gitconfig~/project/.git/config
        2017-08-04 19:54:06Z
      4. 一旦运行了git init,我们应该将filemode设置为true吗?
        2017-11-20 20:53:47Z
      5. 醇>

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

      您可以使用--chmod=(-|+)x选项git-update-index(1) - 将工作树中的文件内容注册到索引“> git update-index (低级版本的”git add“)来改变索引中的执行权限,从那里如果你使用“git commit”(而不是“git commit -a”),它就会被拿起来。

          
      50
      2017-05-23 11:47:32Z
      1. 这应该被编辑成Greg Hewgill的答案,而不是作为一个单独的答案添加,从而创建一个具有单一明确表示的最高答案。
        2012-06-13 12:37:40Z
      2. @ Greg:一个人需要有足够的积分来编辑自己的答案;我想我当时没有足够的编辑权限。
        2012-06-15 16:34:39Z
      3. @ Jakub我认为你现在有足够的声誉:)这个命令对于一个示例文件会是什么样子?
        2018-05-03 20:09:31Z
      4. 醇>

      您可以全局配置:

      git config --global core.filemode false

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

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

      git config --unset core.filemode

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

      git config core.filemode false

          
      34
      2015-01-21 09:12:25Z
      1. 如果主要答案没有帮助你 - 试试这个。如果要检查本地配置而不修改它,请检查git config -l(列出当前配置 - 本地和全局)
        2015-12-14 19:41:56Z
      2. 醇>

      如果您已使用 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。

          
      20
      2015-10-13 07:34:57Z
      1. 你是说整个项目(开发,分期和生产)应该是755?
        2016-02-01 22:48:01Z
      2. @ Daniel Feb:否。只更改必要文件的模式。
        2016-02-10 05:09:41Z
      3. For best practises don't Keep core.fileMode false always你是什么意思,你应该解释一下。
        2016-06-22 12:43:19Z
      4. For best practises don't Keep core.fileMode false always.某些文件系统(例如FAT)不支持文件权限,因此操作系统将报告默认值(无论如何我的系统为766)。在这种情况下,core.filemode在本地配置中是绝对必要的,除非你想通过不必要的和无意的权限更改来破坏提交历史记录
        2016-10-19 17:39:37Z
      5. 另外,为什么还要费心改变烫发?如果设置core.filemode=false,则git将忽略执行位更改,无需更改本地权限。除非您已经对索引添加了权限更改,否则在您关闭git add后,您将缺少需要core.filemode的步骤。
        2016-10-19 17:47:59Z
      6. 醇>

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

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

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

       
      git nfm status
      
          
      16
      2019-06-07 12:18:37Z

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

          
      14
      2013-07-16 12:23:45Z
      1. 如果该行不在配置文件中,则无效。如果要为子模块更改它,请尝试:git submodule foreach git config core.fileMode false
        2014-11-14 19:39:27Z
      2. 醇>

      简单解决方案:

      在项目文件夹中点击简单推荐它不会删除您的原始更改) ...它只会删除更改在您更改项目文件夹权限 时,已完成

      推荐如下:

      git config core.fileMode false

      为什么要修改所有不必要的文件: 因为您已更改项目文件夹权限 赞扬 sudo chmod -R 777 ./yourProjectFolder

      你什么时候检查你做了什么改变? 您在使用 git diff filename

      时发现如下所示

          
      2
      2018-03-19 13:13:57Z

      这对我有用:

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

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

       
      find . -type f -exec chmod a+x {} \;
      
          
      1
      2018-04-30 15:06:11Z
      1. 这会改变文件的权限,但不会使git忽略文件的文件权限。
        2019-01-11 18:39:32Z
      2. 醇>
来源放置 这里