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

use*_*059 13 git newline

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

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

Von*_*onC 18

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

犯9472935(2017年11月16日)由托斯滕Bögershausen( )tboegi.
(通过合并JUNIOÇ滨野- gitster-提交af6e0fe 11月27日2017)

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"
Run Code Online (Sandbox Code Playgroud)

用户必须确保没有未跟踪的文件,否则从现在开始添加和跟踪它们.

新的"add --renormalize"不会添加未跟踪的文件:

$ echo "* text=auto" >.gitattributes
 $ git add --renormalize .
 $ git commit -m "Introduce end-of-line normalization"
Run Code Online (Sandbox Code Playgroud)

请注意," git add --renormalize <pathspec>"是" "的缩写形式git add -u --renormalize <pathspec>.

  • @ Pierre.Sassoulas然而,您可以随时升级Git:http://lifeonubuntu.com/upgrading-ubuntu-to-use-the-latest-git-version/ (2认同)

Chr*_*ial 10

如果您只想在设置core.autocrlf或后重新规范化当前提交text=auto,以便可以在一次提交中对所有行结尾进行规范化,请运行以下命令:

git rm --cached -rf .
git add .
Run Code Online (Sandbox Code Playgroud)

要标准化工作目录中的文件,请运行:

git checkout .
Run Code Online (Sandbox Code Playgroud)


Shi*_*zmo 2

这可以在没有 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
Run Code Online (Sandbox Code Playgroud)

grep 假设任何包含空字符的内容都是二进制文件。

perl 用于就地编辑每个文件。首先,Windows 风格的换行符更改为 Unix 风格的换行符。然后 Mac 风格换行符更改为 Unix 风格换行符。