我试图让git在任何操作中都不改变任何行尾。不幸的是,它似乎不管怎样都不改变行尾。我已经把它简化为下面的测试用例,它有尽可能多的不同机制来禁用这种行为。
- 从两台计算机开始(Windows计算机= A,Linux计算机= B)
- 在两台计算机上:第一个月
- 在两台计算机上:
git config --global core.eol crlf
(以防万一) - 在A上创建新存储库。从空文件夹:
git init --shared
(然后取消隐藏创建的.git
目录)- 在存储库中创建新文件
.gitignore
- 在存储库中创建一个新文件
.gitattributes
,其中包含一行:* -text
git add .
,然后是git commit -m "initial commit"
以解决问题,例如this。git branch master_recv
- 添加遥控器
- 在包含CRLF的存储库中创建新文件
document.txt
- 提交:
git add -A
,然后是git commit -m "<something>"
- 注意A的
document.txt
仍然包含CRLF(删除它并使用--hard
重置返回仍然包含CRLF的版本) - SCP将整个目录复制到计算机B
- 添加包含CRLF的新文件
new file
- 提交:
git add -A
,然后git commit -m "<something>"
- 请注意,B的
document.txt
和new file
仍包含CRLF - 将B的主文件拉到A:x1米20英寸1x
- A的
document.txt
已更改为LF。添加的文件new file
也包含LF。
如果B是Windows计算机,则不会出现此问题。
6条答案
按热度按时间fdbelqdn1#
一个简单的解决方案是:
第一个月
git add --renormalize .
如果转换是自动完成的,则意味着存储库中存在
.gitattributes
core.eol
directive。使用Git 2.8+ (March 2016),检查是否仍存在eol转换:
wj8zmpe12#
在你的项目中,应该有一个
.gitattributes
文件,大多数情况下,它应该如下所示(或者screen-shot):将
* text=auto
更改为* text=false
以禁用自动处理(请参见screen-shot)。就像这样:
如果你的项目没有. gitattributes文件,那么行尾是由你的git配置来设置的。要更改你的git配置,可以这样做:
转到此目录中的配置文件:
1.在Notepad ++(或您喜欢的任何文本编辑器)中打开配置文件
1.将"autocrlf ="更改为假。
对于TortoiseGIT的用户:* 自动CrLf转换 * 设置位于GUI的 * GIT * 部分。
0lvr5msh3#
以下是您如何为单个回购协议执行此操作。
在存储库的根目录下创建包含以下行的文件
.gitattributes
就是这样,这是一个匹配所有文件的通配符,告诉git取消设置text属性。这意味着git在进行行尾规范化时,会将所有文件视为非文本文件,并完全禁用它。其他特定于文本的git命令不受影响,只会更改行尾规范化。
57hvy0tb4#
我想通了。看起来SCP程序正在转换行尾。当我试图故意制作一个带有LF结尾的文件,然后观察到它在下载时显示为CRLF时,我注意到了这一点。
既然这是我的解决方案,我接受这个答案,但未来的人也应该参考其他答案,找到一个更普遍的解决方案。
w1jd8yoj5#
来自gitattributes(5) Manual Page“效果”主题
第一个月
此属性启用并控制行尾规范化。规范化文本文件后,其行尾将在存储库中转换为LF。要控制工作目录中使用的行尾样式,请对单个文件使用
eol
属性,对所有文本文件使用core.eol
配置变量。Set
设置路径的text属性可启用行尾规范化并将路径标记为文本文件。行尾转换无需猜测内容类型即可进行。
Unset
取消设置路径的text属性会告诉Git在签入或 checkout 时不要尝试任何行尾转换。未使用新(1.7.2+)Git中的
core.autocrlf
,core.eol
和正确设置|取消文本属性设置被认为是更可靠的方式ljo96ir56#
我试图防止文件在Windows上切换到CRLF行结束,发现当我从GitHub克隆repo时,使用
*.md eol=lf
将.gitattributes文件添加到存储库中会使我的README.md文件保持LF行结束。我在
git config core.autocrlf false
设置或将我的VSCode编辑器设置为使用LF行尾方面没有运气。