【问题标题】:Git: how to renormalize line endings in all files in all revisions?Git:如何重新规范所有修订版中所有文件的行尾?
【发布时间】:2011-11-01 16:05:47
【问题描述】:

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

用具有标准化行尾的文件重新填充整个存储库的最简单方法是什么?

【问题讨论】:

  • 我以为所有选项都已经在stackoverflow.com/questions/1011985/… 中提供了?
  • tree-filter 对我来说太慢了。即使是一一挑选变化也更快。
  • 慢?但这是一次性操作,您不会每天都重复。一天晚上启动,第二天早上回来。在你的情况下这不可能吗?
  • 原来它很慢,因为它是 Cygwin。在 Linux 中就可以了。
  • 使用 Git 2.16(2018 年第一季度),您将拥有 git add --renormalize .:请参阅 my answer below

标签: git newline


【解决方案1】:

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

参见Torsten Bögershausen (tboegi)commit 9472935(2017 年 11 月 16 日)。
(由 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(2019 年 2 月)修复了与此相关的错误:“git add --ignore-errors”没有像宣传的那样工作,而是作为“git add --renormalize”的非预期同义词工作,已修复。

参见Jeff King (peff)commit 9e5da3d(2019 年 1 月 17 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 1c41824,2019 年 2 月 5 日)

添加:使用单独的 ADD_CACHE_RENORMALIZE 标志

Commit 9472935add:介绍“--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 标志来解决这个问题,并使用 它将HASH_RENORMALIZE 设置在add_to_index() 内。
为了明确这两个标志来自不同的集合,我们也将函数中的名称“newflags”更改为“hash_flags”。

另外:参见 Jeff King (peff)commit e2c2a37(2019 年 2 月 7 日)。
(由 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”。

【讨论】:

  • Ubuntu 17.10 仍然有 git 2.14。这个答案超前了:)
  • @Pierre.Sassoulas 不过,你可以随时升级 Git:lifeonubuntu.com/upgrading-ubuntu-to-use-the-latest-git-version
  • 谢谢,我来这里是因为我看了文档,我的版本不配合。问题已解决。
  • 谢谢。顺便说一句,我更喜欢通过在我的 gitattributes 中指定 * -text 然后删除并用git 不应该触及的最终正确的行尾。
  • @JustAMartin 同意,但 git add --renormalize 不应该避免再次删除/添加步骤吗?
【解决方案2】:

如果您只想在设置 core.autocrlftext=auto 后重新规范化当前提交,以便在一次提交中完成所有行尾规范化,请运行以下命令:

git rm --cached -rf .
git add .

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

git checkout .

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-19
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      相关资源
      最近更新 更多