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

时间:2011-08-23 05:37:11

标签: git newline

我有一个现有的存储库,其中行结尾都搞砸了。我想重写整个存储库并一劳永逸地修复行结尾。有文本文件和二进制文件,我们假设git用于检测二进制文件的启发式方法可以正常工作。

使用带有规范化行结尾的文件重新填充整个存储库的最简单方法是什么?

3 个答案:

答案 0 :(得分:13)

自Git 2.16(2018年第一季度)以来,除了“ git add --renormalize . ”之外还有另一种方式(除了删除索引内容),这是记录事实的一种新的更安全的方式你正在纠正行尾约定

commit 9472935Torsten Bögershausen (tboegi)(2017年11月16日) Junio C Hamano -- gitster --于2017年11月27日commit af6e0fe合并)

  

add:介绍“--renormalize

     

使标准化存储库中的行结尾更安全   使用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 <pathspec>”是缩写形式   “git add -u --renormalize <pathspec>”。

注意:Git 2.21(2019年2月)修复了与此相关的错误:“git add --ignore-errors”没有像宣传的那样工作,而是作为“git add --renormalize”的非预期同义词,固定的。

commit 9e5da3dJeff King (peff)(2019年1月17日) Junio C Hamano -- gitster --合并于commit 1c41824,2019年2月5日)

  

add:使用单独的ADD_CACHE_RENORMALIZE标志

     

Commit 9472935add:介绍“--renormalize”,2017-11-16,Git 2.16)教git addHASH_RENORMALIZE传递给{{1}然后传递   国旗到add_to_index()   但是,index_path()采用的标记和add_to_index()采用的标记是不同的名称空间   我们无法在index_path()中使用HASH_*个标记,因为它们   与我们已经采用的add_to_index()标志重叠(在这种情况下,   ADD_CACHE_*HASH_RENORMALIZE)冲突。

     

我们可以通过添加新的ADD_CACHE_IGNORE_ERRORS标志并使用来解决此问题   它可以在ADD_CACHE_RENORMALIZE内设置HASH_RENORMALIZE   为了清楚地表明这两个标志来自不同的集合,我们还将函数中的名称“add_to_index()”更改为“newflags”。

另外:commit e2c2a37Jeff King (peff)(2019年2月7日) (由Junio C Hamano -- gitster --合并于commit 9293bf6,2019年2月7日)

  

hash_flags:转换忘记add_to_index()检查

     

提交9e5da3dHASH_RENORMALIZE:使用单独的add标记,   2019-01-17)在我们的标记字段中使用ADD_CACHE_RENORMALIZE切换为a   新的HASH_RENORMALIZE标志   但是,它忘了将ADD_CACHE_RENORMALIZE的其中一个检查转换为新标志,这完全打破了“HASH_RENORMALIZE”。

答案 1 :(得分:2)

如果您只想在设置core.autocrlftext=auto后重新规范当前提交,那么您可以在一次提交中将所有行结束规范化,运行以下命令:

git rm --cached -rf .
git add .

要规范化工作目录中的文件,请运行:

git checkout .

答案 2 :(得分:0)

这可以在没有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风格的换行符。