我有一个已经存在的仓库,里面的行尾都乱了。我想重写整个仓库,一劳永逸地修复行尾。有文本文件和二进制文件,让我们假设git的启发式检测二进制文件的方法可以正常工作。用带有规范化行结束符的文件重新填充整个存储库的最简单方法是什么?
zwghvu4y1#
自Git 2.16(2018年第一季度)以来,还有另一种方法(除了删除索引内容),这是一种新的更安全的方法来记录您正在纠正行尾约定的事实:
一月一日
参见commit 9472935(2017年11月16日),作者Torsten Bögershausen ( tboegi )。(由Junio C Hamano -- gitster --合并至commit af6e0fe,2017年11月27日)
tboegi
gitster
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日)
git add --renormalize <pathspec>
git add -u --renormalize <pathspec>
git add --ignore-errors
git add --renormalize
peff
Commit 9472935(add:introduce“--renormalize“,2017-11-16,Git 2.16)教git add将HASH_RENORMALIZE传递给add_to_index(),然后将标志传递沿着index_path()。但是,add_to_index()和index_path()使用的标志是不同的命名空间。我们不能在add_to_index()中使用HASH_*标志,因为它们与我们已经使用的ADD_CACHE_*标志重叠(在本例中,HASH_RENORMALIZE与ADD_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日)
git add
HASH_RENORMALIZE
add_to_index()
index_path()
HASH_*
ADD_CACHE_*
ADD_CACHE_IGNORE_ERRORS
ADD_CACHE_RENORMALIZE
newflags
hash_flags
提交9e5da3d(add:使用单独的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日)
PhilipOakley
doc add
签字人:菲利普·奥克利审核人:托尔斯滕·伯格斯豪森一个bug report注意到一个包含/r/r/n的文件需要重新规范化 * 两次 *。这是故意的。
/r/r/n
未与LF配对的单独CR字符保持不变。
请注意文档中“clean“过滤器的这一限制。在9472935(add: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。
clean
-u
xoefb8l82#
如果你只想在设置了core.autocrlf或text=auto之后重新规范化你当前的提交,这样你就可以在一次提交中规范化所有的行结束,运行这些命令:
core.autocrlf
text=auto
git rm --cached -rf . git add .
要正常化工作目录中的文件,请运行:
git checkout .
zvokhttg3#
这可以在没有git的情况下使用。然后,稍后,git commit代码库。
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风格的换行符。
3条答案
按热度按时间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的老方法是这样的:
用户必须确保不存在未跟踪的文件,否则从现在开始,它们将被添加和跟踪。
新的“add --renormalize”不会添加未跟踪的文件:
请注意,“
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 9472935(
add
:introduce“--renormalize
“,2017-11-16,Git 2.16)教git add
将HASH_RENORMALIZE
传递给add_to_index()
,然后将标志传递沿着index_path()
。但是,
add_to_index()
和index_path()
使用的标志是不同的命名空间。我们不能在
add_to_index()
中使用HASH_*
标志,因为它们与我们已经使用的ADD_CACHE_*
标志重叠(在本例中,HASH_RENORMALIZE
与ADD_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
检查提交9e5da3d(
add
:使用单独的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
“过滤器的这一限制。在9472935(
add
: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。
xoefb8l82#
如果你只想在设置了
core.autocrlf
或text=auto
之后重新规范化你当前的提交,这样你就可以在一次提交中规范化所有的行结束,运行这些命令:要正常化工作目录中的文件,请运行:
zvokhttg3#
这可以在没有git的情况下使用。然后,稍后,
git commit
代码库。grep假设任何包含空字符的文件都是二进制文件。
perl用来编辑每个文件。首先,Windows风格的换行符被修改为Unix风格的换行符。然后Mac风格的换行符被修改为Unix风格的换行符。