Git:如何在所有版本中重新规范化所有文件中的行尾?
我有一个现有的存储库,其中的行尾都是乱七八糟的。我想重写整个存储库并一次性修复行结束。有文本文件和二进制文件,让我们假设git用于检测二进制文件的启发式方法可以很好地工作Git:如何在所有版本中重新规范化所有文件中的行尾?,git,newline,Git,Newline,我有一个现有的存储库,其中的行尾都是乱七八糟的。我想重写整个存储库并一次性修复行结束。有文本文件和二进制文件,让我们假设git用于检测二进制文件的启发式方法可以很好地工作 用规范化的行尾文件重新填充整个存储库的最简单方法是什么?这可以在没有git的情况下使用。然后,稍后,git提交代码库 for f in $(find ./ -type f ) ; do if grep -qP '\x00' $f ; then # file is binary continu
用规范化的行尾文件重新填充整个存储库的最简单方法是什么?这可以在没有git的情况下使用。然后,稍后,
git提交
代码库
for f in $(find ./ -type f ) ; do
if grep -qP '\x00' $f ; then
# file is binary
continue
fi
perl -pe 'BEGIN{ undef $/} s/\x0d\x0a/\x0a/g;s/\x0d/\x0a/g' -i $f
done
grep假设任何包含空字符的内容都是二进制文件
perl用于在位编辑每个文件。首先,Windows样式的换行符更改为Unix样式的换行符。然后,Mac样式的换行符将更改为Unix样式的换行符。如果您只想在设置了
core.autocrlf
或text=auto
之后重新规范化当前的提交,那么您可以在一次提交中实现所有的行结束规范化,请运行以下命令:
git rm --cached -rf .
git add .
要规范化工作目录中的文件,请运行:
git checkout .
自Git 2.16(2018年第1季度)以来,还有另一种方法(除了删除索引内容),即“Git add--renormalize.
”,这是一种新的、更安全的方法来记录您正在纠正行尾约定的事实
参见。(于2017年11月27日被合并)
添加
:引入“——重新规范化
”
使存储库中的行尾标准化更加安全。使用CRLF提交的文件将使用LF提交 回购协议正常化的旧方法如下:
# Make sure that there are not untracked files
$ echo "* text=auto" >.gitattributes
$ git read-tree --empty
$ git add .
$ git commit -m "Introduce end-of-line normalization"
用户必须确保没有未跟踪的文件,
否则,从现在起,它们将被添加和跟踪
新的“add--renormalize”不会添加未跟踪的文件:
$ echo "* text=auto" >.gitattributes
$ git add --renormalize .
$ git commit -m "Introduce end-of-line normalization"
请注意,“git add--renormalize
”是
“git add-u--renormalize
”
注意:Git 2.21(2019年2月)修复了一个与此相关的错误:“
Git add--ignore errors
”没有像广告中那样工作,而是作为“Git add--renormalize
”的非预期同义词工作,该错误已被修复
参见(2019年1月17日)作者。(于2019年2月5日合并) 添加:使用单独的添加\缓存\重新规范化标志 (
add
:引入“--renormalize
”,2017-11-16,Git 2.16)教授Git add
通过HASH\u renormalize
到add\u to\u index()
,然后通过
沿索引路径()的标志
但是,add_to_index()
和index_path()
使用的标志是不同的名称空间。
我们不能在add\u to\u index()
中使用HASH.*
标志,因为它们
与我们已经使用的ADD\u CACHE.*
标志重叠(在本例中,
HASH\u RENORMALIZE
与ADD\u CACHE\u IGNORE\u ERRORS
冲突
我们可以通过添加一个新的ADD\u CACHE\u RENORMALIZE
标志并使用
在add\u to\u index()中设置HASH\u RENORMALIZE
为了明确这两个标志来自不同的集合,我们还将函数中的名称“newflags
”更改为“hash\u flags
”
另外:参见(2019年2月7日)作者。
(于2019年2月7日合并)
add\u to\u index()
:转换遗忘的哈希值\u重新规范化检查
提交(add
:使用单独的add\u CACHE\u RENORMALIZE
标志,
2019-01-17)在我们的标志字段中使用HASH\u RENORMALIZE
切换出
新建ADD\u CACHE\u RENORMALIZE
标志。
但是,它忘记了将对HASH_RENORMALIZE
的一个检查转换为新标志,这完全破坏了“git add--RENORMALIZE
”
我以为所有的选项都已经在?树过滤器对我来说太慢了。就连采摘樱桃的变化一个接一个都快。慢?但这是一次性手术,你不会每天重复。一天晚上发射,第二天早上回来。在你的情况下,这不可能吗?结果很慢,因为是Cygwin。这在Linux中很好。使用Git2.16(2018年第1季度),您将拥有Git2.14。这个答案是超前的:)@Pierre.Sassoulas但是,你可以随时升级Git:谢谢,我来这里是因为我读了文档,我的版本不配合。问题解决了,谢谢。顺便说一句,我更喜欢保持文件原样,不进行任何自动转换(例如,避免在Windows上将sh脚本转换为crlf,或在Linux上将cmd脚本转换为lf)通过在my gitattributes中指定*-text
,然后删除并读取带有git永远不会触及的最后正确行尾的文件。@JustAMartin同意,但不应该git add--renormalize
避免再次删除/添加步骤?