Git:如何重新规范所有版本的所有文件中的行尾?

hs1rzwqc  于 2023-03-28  发布在  Git
关注(0)|答案(3)|浏览(112)

我有一个已经存在的仓库,里面的行尾都乱了。我想重写整个仓库,一劳永逸地修复行尾。有文本文件和二进制文件,让我们假设git的启发式检测二进制文件的方法可以正常工作。
用带有规范化行结束符的文件重新填充整个存储库的最简单方法是什么?

zwghvu4y

zwghvu4y1#

自Git 2.16(2018年第一季度)以来,还有另一种方法(除了删除索引内容),这是一种新的更安全的方法来记录您正在纠正行尾约定的事实:

一月一日

参见commit 9472935(2017年11月16日),作者Torsten Bögershausen ( tboegi )
(由Junio C Hamano -- gitster --合并至commit af6e0fe,2017年11月27日)

add:介绍“--renormalize

使存储库中的行尾规范化更安全。
使用CRLF提交的文件将使用LF提交。
规范化一个repo的老方法是这样的:

# 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 <pathspec>”是“git add -u --renormalize <pathspec>”的缩写形式。
注:Git 2.21(Feb. 2019)修复了一个与此相关的bug:“git add --ignore-errors”并没有像广告中所说的那样工作,而是作为“git add --renormalize”的意外同义词工作,这已经被修复。
参见commit 9e5da3d(2019年1月17日),作者Jeff King ( peff )
(由Junio C Hamano -- gitster --合并至commit 1c41824,2019年2月5日)

add:使用单独的ADD_CACHE_RENORMALIZE标志

Commit 9472935add:introduce“--renormalize“,2017-11-16,Git 2.16)教git addHASH_RENORMALIZE传递给add_to_index(),然后将标志传递沿着index_path()
但是,add_to_index()index_path()使用的标志是不同的命名空间。
我们不能在add_to_index()中使用HASH_*标志,因为它们与我们已经使用的ADD_CACHE_*标志重叠(在本例中,HASH_RENORMALIZEADD_CACHE_IGNORE_ERRORS冲突)。
我们可以通过添加新的ADD_CACHE_RENORMALIZE标志来解决这个问题,并使用它在add_to_index()中设置HASH_RENORMALIZE
为了明确这两个标志来自不同的集合,我们还将函数中的名称“newflags”更改为“hash_flags”。
另请参阅commit e2c2a37(07 Feb 2019)by Jeff King ( peff )
(由Junio C Hamano -- gitster --合并于commit 9293bf6,2019年2月7日)

add_to_index():转换遗忘的HASH_RENORMALIZE检查

提交9e5da3dadd:使用单独的ADD_CACHE_RENORMALIZE标志,2019-01-17)在我们的标志字段中使用HASH_RENORMALIZE切换为新的ADD_CACHE_RENORMALIZE标志。
但是,它忘记将HASH_RENORMALIZE的一个检查转换为新标志,这完全破坏了“git add --renormalize”。
Git 2.37.3(Q3 2022),“git add --renormalize”(man)澄清了一个角落案例
参见commit efae7ce(2022年8月10日),作者Philip Oakley ( PhilipOakley )
(由Junio C Hamano -- gitster --合并于commit 58ded4a,2022年8月18日)

doc add:重正化对于CRCRLF不是幂等的

签字人:菲利普·奥克利
审核人:托尔斯滕·伯格斯豪森
一个bug report注意到一个包含/r/r/n的文件需要重新规范化 * 两次 *。
这是故意的。

未与LF配对的单独CR字符保持不变。

请注意文档中“clean“过滤器的这一限制。
9472935add:introduction,2017-11-16,Git v2.16.0-rc 0--merge listed in batch #6)(添加:introduce“--renormalize“,Torsten Bögershausen,2017-11-16)
git add现在在其手册页中包括:
此选项表示-u
单独的CR字符未受影响,因此当CRLF清除为LF时,CRCRLF序列仅部分清除为CRLF。

xoefb8l8

xoefb8l82#

如果你只想在设置了core.autocrlftext=auto之后重新规范化你当前的提交,这样你就可以在一次提交中规范化所有的行结束,运行这些命令:

git rm --cached -rf .
git add .

要正常化工作目录中的文件,请运行:

git checkout .
zvokhttg

zvokhttg3#

这可以在没有git的情况下使用。然后,稍后,git commit代码库。

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风格的换行符。

相关问题