当前位置: 首页 > article >正文

2412git,gitdiff与编码

原文

除了git命令行工具外,还有其他工具或服务可让你查看git历史记录中的更改.最有趣的是那些按拉请的一部分更改的情况,因为这些是你正在审查和批准的更改.

一个常见的问题是,它们给你展示的可能不是实际改变的内容.

我把讨论限制在我有经验的服务和工具上,即它是git命令行,AzureDevOps,GitHubVS.欢迎你共享你使用的其他服务的细节,尤其是用来审查代码的服务.

首先,考虑一个更改文件编码的提交.即,假设文件如下:

I just checked.
It costs A31.

其中A3表示0xA3十六进制值的单个字节.这在Windows1252代码页中,是的表示.
假设你按UTF-8更改此文件的编码:

It costs C2A31.

如果在命令行中用git show查看它,你会得到:

  I just checked.
- It costs <A3>1.
+ It costs £1.

命令行版本显示以前有个0xA3字节但现在有一个£符.
接着是GitHub.它的差异

  I just checked.
- It costs  1.
- It costs £1.

GitHub假设所有文件都是UTF-8的,因此它按非法的UTF-8代码单元序列解释A3,并使用U+FFFD替换符表示.
接着TeamFoundationServices,VisualStudioOnline,VisualStudioTeamServices,AzureDevOps.AzureDevOps.就是该名字.AzureDevOps.
下面是AzureDevOps显示的内容:

 The file differs only in whitespace.

如果你展开文件并允许(显示空白更改),它不会显示更改,甚至不会显示空格更改!

I just checked.
It costs £1.

非常令人担忧,因为即,如果你更改了文件的文本,且还更改了编码,AzureDevOps高亮更改文本,但不会告诉你,已更改编码!
如,也许有人更改了第一行文本,并意外地按UTF-81252更改编码.AzureDevOps显示它为

I just checked.
I just looked.
It costs £1.

愉快地给你展示更改文本,但完全忽略了编码更改.
该编码更改可能会导致你无意中更改了资源脚本中的一组串这里,从而导致错编码.
如果要求VS查看差异,它表示已修改(M)文件,但是当你要求查看差异时,它会显示"0更改",且不会高亮内容.
现在考虑在文件开头插入UTF-8BOM的提交.
在使用git的命令行中,可得到如下:

- I just checked.
+  I just checked.

按一个空格显示BOM.不是很好,但至少有一个+/-来告诉你有什么变化,如果第一行不是空白的,则移动的内容告诉你在文件开头插入了些东西.
GitHub,差异如下:

- I just checked.
- I just checked.

高亮告诉你该行有了一些变化,但是你看不到变化.更改必然是不可见的,但至少告诉你了,该行有更改;只是你看不到它.
最后,AzureDevOps:

 The file differs only in whitespace.

如前,即使你展开文件并允许"显示空白更改",你也看不见更改.

I just checked.
It costs £1.

因此,AzureDevOps会告诉你文件有空格更改,但你查看它时,不会显示更改.

如果要求VS查看差异,它会再次指示已修改(M)文件,但是当你要求查看差异时,它会显示"0更改",且不会高亮内容.

我怀疑,在GitHub,AzureDevOpsVS没有显示可见更改时,大多数用户只会认为,“一定是个错误”,而没有发现,实际上,那里有你看不到的变化.

因此,按一个表格总结这些结果.

=git命令行GitHubAzureDevOpsVS
代码页UTF-8格式UTF-8格式
更改编码差异显示差异显示不显示更改不显示更改
更改BOM按空格显示不可见同上同上

结论,如果使用这些系统中的一个工作,在处理包含7位美标集外的符时需要密切注意,因为很难发现编码或BOM的变化,甚至完全不可见.
即使它极大改变了文件内容.


http://www.kler.cn/a/461572.html

相关文章:

  • C# 在PDF中添加和删除水印注释 (Watermark Annotation)
  • C语言——字符函数和内存函数
  • 树莓派 Pico RP2040 教程点灯 双核编程案例
  • 一个hive插入数据失败的问题
  • 黑马JavaWeb开发跟学(十四).SpringBootWeb原理
  • 《Vue3实战教程》34:Vue3状态管理
  • SSH 连接远程仓库并推送本地项目
  • mysql带自动递增列的表删除数据后如何重置递增值
  • 【再谈设计模式】策略模式 ~ 算法与行为的灵活调度员
  • L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)
  • 【高阶数据结构】哈希表
  • 【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测
  • 前端网络之【浏览器跨域问题分析与解决方案】
  • 在WPS制作的Excel表格中如何快速插入特殊符号,使用Alt快捷简单又高效
  • 每天40分玩转Django:Django即时聊天应用实战
  • VR线上虚拟展厅有哪些技术支撑?
  • html+css网页制作 美食 美食部落6个页面
  • java AQS
  • cocos creator 3.x版本如何添加打开游戏时首屏加载进度条
  • Qt天气预报系统设计界面布局第三部分
  • 爬虫 - 爬取王者荣耀所有皮肤图片
  • csrf跨站请求伪造(portswigger)无防御措施
  • pyinstaller打包exe可执行文件
  • Cherno C++学习笔记 P47 动态数组Vector
  • JS中的鼠标事件和键盘事件基础
  • 汇川Easy系列正弦信号发生器(ST源代码)