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的情况下使用。然后,稍后,
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
避免再次删除/添加步骤?