git签出分支最终修改了文件
我有一台Mac电脑,我在上面克隆了回购协议。当我签出任何分支时,我拥有的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
.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 consultcore.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