如何在Git中规范化工作树行结尾?

时间:2013-03-26 15:42:30

标签: git line-endings gitattributes

我克隆了一个存在不一致行结尾的存储库。我添加了一个.gitattributes来设置我想要规范化的文件的text属性。现在,当我提交更改时,我收到消息:

warning: CRLF will be replaced by LF in FILE.
The file will have its original line endings in your working directory.

如何让git为我标准化文件的工作副本?我希望git能够规范整个工作树。

6 个答案:

答案 0 :(得分:77)

对于使用v2.16或更高版本的用户,您只需使用:

git add --renormalize .  # Update index with renormalized files
git status               # Show the files that will be normalized
git commit -m "Introduce end-of-line normalization"

这些指示直接来自gitattributes。对于旧版本,docs (在v2.12之前)提供了不同的答案:

rm .git/index     # Remove the index to force git to
git reset         # re-scan the working directory
git status        # Show files that will be normalized
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

编辑.gitattributes后执行此序列。

更新

似乎有些用户在使用上述说明时遇到了问题。 gitattributes(2.12到2.14)的更新文档显示了一组新的指令(在编辑.gitattributes文件之后):

git read-tree --empty   # Clean index, force re-scan of working directory
git add .
git status        # Show files that will be normalized
git commit -m "Introduce end-of-line normalization"

感谢@vossad01指出这一点。

此外,使用任一解决方案,工作副本中的文件仍保留其旧行结尾。如果您想更新它们,请确保工作树干净并使用:

git rm --cached -r .
git reset --hard

现在,您的工作树中的行结尾将是正确的。

答案 1 :(得分:48)

使用Git客户端2.16及更高版本,现在有一种更简单的方法可以做到这一点。只需使用git add --renormalize .

即可

答案 2 :(得分:5)

替代方法(仅在使用的命令方面有所不同)

确保存储库中没有任何待处理的更改:

$ git status
$ git stash

修改.gitattributes以便更改CRLF解释:

$ echo "*.txt  text" >>.gitattributes
$ git commit -m "Made .txt files a subject to CRLF normalization." -- .gitattributes

从索引中删除数据并刷新工作目录:

$ git rm --cached -r .
$ git reset --hard

回顾Git提出的CRLF修正案:

$ git ls-files --eol
$ git status
$ git diff

同意Git决定:

$ git add -u
$ git commit -m "Normalized CRLF for .txt files"

重新加载更改,就像完成了干净克隆一样:

$ git rm --cached -r .
$ git reset --hard

答案 3 :(得分:2)

.gitattributes设置只会影响新的提交。如果此存储库已发布 no 历史记录(没有其他人依赖它),您可能需要浏览整个历史记录。在Unix / Linux中,您可以使用dos2unix(1)find(1)一起修复所有文件,并使用filter-branch的历史记录重写(请参阅git手册中的discussion)你甚至可以清理整个项目的历史。

在新鲜的克隆上使用时要特别小心。与可能拥有克隆的任何人取得联系,并告知他们您想要做什么。

答案 4 :(得分:0)

如果.gitattributes中的* text = auto选项使Git存储库包含带有CRLF(Windows)行尾且现在标记为文本的文件,则它会处于“非法状态”(请参见https://marc.info/?l=git&m=154484903528621&w=2)。标准的重新规范化选项无法与LFS过滤器一起正常使用,因此其他答案或例如https://help.github.com/en/articles/dealing-with-line-endings中的说明将无法正常工作。相反,这些步骤对我们有用:

情况:

  • 在Windows上
  • Git存储库包含CR和CRLF行尾的文件
  • 在.gitattributes中添加了* text = auto(因此不依赖于在Windows上设置了core.crlf = auto的用户)
  • 对于LFS跟踪的文件,也将-crlf更改为-text,不确定是否需要。

    1. 从出现行尾问题的分支中创建一个新分支(假设那里没有未提交的更改):git checkout -b feature / doing-stuff-fix-eol
    2. 从.gitattributes中删除LFS过滤器(全部替换为'filter = lfs diff = lfs merge = lfs')
    3. 提交并推送:git commit -a -m“为EOL修复禁用LFS过滤器”
    4. 移动到非git文件夹
    5. 全局卸载LFS:git lfs卸载
    6. 创建一个新的存储库克隆:git clone -b feature / doing-stuff-fix-eol [远程存储库URL] fix-eol
    7. 标准化行尾:git add --renormalize。 (请注意要重新规范化所有文件的点)
    8. 仅检查正确的标准化文件。它不应包含通常由LFS处理的文件!
    9. 提交并推送(保存哈希):git commit -m“修复行尾”
    10. 移动到非git文件夹
    11. 全局安装LFS:git lfs install
    12. 转到原始存储库克隆并拉出
    13. 签出原始分支:git checkout功能/ doing-stuff
    14. Cherry选择eol修复提交并推送:git cherry-pick [hash]
    15. 删除eol分支并推送
    16. 删除eol存储库克隆(如果需要修复更多分支,则保留该克隆)

答案 5 :(得分:0)

merge.renormalize配置设置可能会有用。

相关问题