我需要在 Git 版本控制下修改源代码。源代码是 Visual Studio 项目文件,这使得它们成为 Microsoft 原生文件。我想避免空白问题,包括行尾游戏。
我在 emacs 下查看了修改前的文件,^M
显然不存在。
然后我从 Linux 机器上的脚本执行了以下命令:
sed -i 's/odbc32.lib //g' *.vcproj
sed -i 's/odbccp32.lib //g' *.vcproj
当我看到这些变化时:
$ git diff cryptest.vcproj
diff --git a/cryptest.vcproj b/cryptest.vcproj
index cec447d..9ae71ea 100644
--- a/cryptest.vcproj
+++ b/cryptest.vcproj
@@ -76,7 +76,7 @@
...
Name="VCLinkerTool"
- AdditionalDependencies="odbc32.lib odbccp32.lib Ws2_32.lib"
+ AdditionalDependencies="Ws2_32.lib"^M
SuppressStartupBanner="true"
...
如何在不添加多余的空格的情况下进行替换?
答案1
如今,emacs 会自动检测文件中使用的行尾,因此您无法看到文件是否有\n
或\r
或\r\n
行尾。emacs 中的任何编辑都会保留并模仿行尾。
要真正了解文件的内容,您可以尝试cat -vet
显示控制字符,包括^M
、制表符(^I
)和行尾($
)。
请注意,git
可以配置为在工作目录和对象数据库之间移动文本文件时自动转换\r\n
为\n
或反之亦然。请参阅此文章和这个文章检查你的 git 是如何配置的(全局和每个存储库的配置),以及如何更改它。
很难看出如何sed
引入\r
。我假设您使用的是 Unix 系统。
在工作目录的顶部检查以下命令是否未显示任何内容:
git config core.eol
git config core.autocrlf
find . -name .gitattributes -o -name attributes
运行原始未编辑的文件cat -vet
并检查所有、部分或没有行以 3 个字符结尾^M$
。