git签出分支最终修改了文件

git签出分支最终修改了文件,git,Git,我有一台Mac电脑,我在上面克隆了回购协议。当我签出任何分支时,我拥有的.json文件最终显示为“已修改” 这是我尝试过的事情的清单 git clone.git git签出版本 git签出--$(git ls files-m) 文件仍显示为已修改: me@box> cat ~/.gitattributes text=auto -crlf me@box> cat .gitconfig [core] autocrlf = true 我也用auto和false尝试了autocr

我有一台Mac电脑,我在上面克隆了回购协议。当我签出任何分支时,我拥有的
.json
文件最终显示为“已修改”

这是我尝试过的事情的清单

  • git clone.git
  • git签出版本
  • git签出--$(git ls files-m)
  • 文件仍显示为已修改:

    me@box> cat ~/.gitattributes
    text=auto
    -crlf
    
    me@box> cat .gitconfig
    [core]
        autocrlf = true
    
    我也用
    auto
    false
    尝试了
    autocrlf

    有没有办法解决这个问题?

    TL;博士 您可能希望
    .gittributes
    (而不是
    ~/.gittributes
    )包含行
    *-text
    *.json-text
    。您可能希望从
    .git/config
    $XDG\u config\u HOME/git/config
    $HOME/.config/git/config
    中删除任何
    autocrlf=true
    设置。您可能希望更好地控制其他文件,具体取决于您和其他人在哪些系统上使用这些存储库的方式

    长的 一方面,这些说法是错误的:

    .gittributes
    中的条目应具有文件名或模式的形式,后跟空白(通常是一个选项卡,但也可以是空白),后跟一个或多个属性。在这里,文件名/模式部分丢失了,尽管Git没有这样看:这告诉Git要做的是不对所有名为
    text=auto
    的文件应用任何属性,不对所有名为
    -crlf
    的文件应用任何属性。由于可能没有具有这些有趣名称的文件,因此这不会对任何文件应用任何属性,因此没有任何效果

    (您可能需要
    *text=auto
    和/或
    *-crlf
    ,但请参见下文。)

    类似地(但可能不是问题),这可能是错误的地方:

    Git在几个地方查找属性文件。最重要的是存储库工作树顶层的
    .gittributes
    ,即
    .gittributes
    ,而不是
    ~/.gittributes
    。您可以让Git consult
    core.attributesFile
    ,您可以将其设置为
    ~/.gittributes
    。如果未设置
    core.attributesFile
    ,现代Git会查找
    $XDG\u CONFIG\u HOME/Git/attributes
    $HOME/.CONFIG/Git/attributes
    ,因此除非您配置了全局
    core.attributesFile
    设置,否则它不会在
    $HOME/.gittributes
    中查找

    观点:
    core.autocrlf
    不是一个好主意 如果这是从您的主目录,这可能是问题的根源

    core.autocrlf
    设置为
    true
    的操作如下所述:

    将此变量设置为“true”与设置
    文本
    在所有文件上属性为“自动”,而
    core.eol
    属性为“crlf”。着手 如果要在工作区中使用CRLF行结尾,则为true 目录和存储库具有LF行结尾。这个变量可以 设置为输入,在这种情况下不执行输出转换

    一般来说,我不喜欢
    text=auto
    ,因为这意味着Git必须猜测您的文件是否为文本。吉特猜错了吗?有时候,是的,会的。如果您在Linux上,在Linux上,行结束转换默认为不做任何事情,这是无害的,但是在Windows和MacOS上,这并不是无害的。这里有一个
    .gittributes
    文件,具体列出了哪些文件中的行尾是有用的

    由于您提到将
    core.autocrlf
    设置为
    false
    ,因此也值得一看
    core.eol
    说明:

    设置要在文件的工作目录中使用的行尾类型 当
    core.autocrlf
    为false时设置了text属性的。 备选方案有lf、crlf和native,它们使用平台的 本机行结束。默认值为本机值。看见 有关行尾转换的详细信息,请参见

    我也用
    auto
    false
    尝试了
    autocrlf

    唯一有效的设置是
    true
    false
    input
    。从技术上讲,将其分别设置为
    1
    0
    、和
    -1
    ,也会起作用,因为Git会尝试将其转换为整数,如果它与其中一个单词不匹配。将其设置为文本字符串
    auto
    使Git将其视为整数,该整数转换为值
    0
    ,因此表示
    false
    。这是默认值,在这种情况下,只要
    .gittributes
    文件中没有覆盖,就会启用
    core.eol

    剩下的大部分要知道的东西都被隐藏了起来,除了一些没有在任何地方正确描述的关键项目。这些要求明确定义Git的索引和工作树

    提交、索引和工作树 首先要认识到的是,任何提交的文件都会冻结到该文件提交形式中的任何数据中,在特定的提交中永远是这样。也就是说,每次提交都会保存每个文件的快照,每个文件都在提交中,但在创建快照的人创建快照(通过运行
    git commit
    )时,它在索引中的形式似乎有点冗余

    如果提交的文件有一行以CR结尾,然后是LF,然后是以CR结尾的第二行(不带LF),然后是以LF结尾的第三行(不带CR),则该文件的提交版本始终具有该格式。任何人对此都无能为力。如果你有那个提交,你就有那个文件,三行的结尾按那个顺序排列。你可以选择查看,也可以不查看;但无论您做什么,或不做什么,该文件都以该提交的形式存在

    但是等等!签出某个文件或提交全部文件的行为并不意味着按原样将该文件放入工作树中。让我们考虑一个文件,如<鳕鱼>
    text=auto
    -crlf
    
    cat ~/.gitattributes
    
    cat .gitconfig
    [core]
        autocrlf = true
    
    $ git checkout branch
    $ echo '* -text' > .gitattributes   # avoid conversions
    $ git add file.ext                  # use whatever's in the work-tree
    
    $ git checkout branch
    $ echo '* -text' > .gitattributes   # avoid conversions
    $ git checkout -- file.ext          # see what's actually in the commit