强制LF eol在git repo和工作副本中

时间:2012-04-02 13:02:16

标签: git github eol

我在github上托管了一个git存储库。许多文件最初是在Windows上开发的,我对行结尾并不太谨慎。当我执行初始提交时,我也没有任何git配置来强制执行正确的行结束。结果是我的github存储库中有许多带有CRLF行结尾的文件。

我现在部分在Linux上开发,我想清理行结尾。如何确保文件在github上使用LF正确存储,并在我的工作副本中使用LF?

我已设置.gitattributes个文件,其中包含text eol=LF;那是对的吗?有了这个承诺和推动,我可以rm我的本地仓库并从github重新克隆以获得预期的效果吗?

3 个答案:

答案 0 :(得分:199)

如果没有关于存储库中的文件(纯源代码,图像,可执行文件......)的一些信息,则回答这个问题有点困难:)

除此之外,我会认为您愿意默认LF作为工作目录中的行结尾,因为您愿意确保文本文件在.git存储库中具有LF行结尾Windows或Linux。确实比抱歉更安全....

然而,还有一个更好的选择:从Linux工作区中的LF行结尾,Windows工作区中的CRLF行结尾和存储库中的LF行结尾中获益。

由于您正在部分使用Linux和Windows,请确保将core.eol设置为native并将core.autocrlf设置为true

然后,使用以下

替换.gitattributes文件的内容
* text=auto

这将让Git在提交和结账时为您处理自动线路结尾转换。二进制文件不会被更改,检测为文本文件的文件将看到即时转换的行结尾。

但是,正如您所知道的存储库内容,您可以帮助Git帮助他检测二进制文件中的文本文件。

如果您使用基于C的图像处理项目,请使用以下内容替换.gitattributes文件的内容

* text=auto
*.txt text
*.c text
*.h text
*.jpg binary

这将确保扩展名为c,h或txt的文件将与您的仓库中的LF行结尾一起存储,并且在工作目录中将具有本机行结尾。不会触及Jpeg文件。所有其他人都将受益于上面所见的相同的自动过滤。

为了更深入地了解这一切的内在细节,我建议你深入了解来自Tim Clem,Githubber的这篇非常好的帖子 "Mind the end of your line"

作为一个真实世界的示例,您还可以查看 commit ,其中展示了对.gitattributes文件的更改。

考虑以下评论更新答案

  

我实际上不想在我的Windows目录中使用CRLF,因为我的Linux环境实际上是一个共享Windows目录的VirtualBox

有道理。谢谢你的澄清。在这个特定的上下文中,.gitattributes文件本身是不够的。

对存储库运行以下命令

$ git config core.eol lf
$ git config core.autocrlf input

由于您的存储库是在Linux和Windows环境之间共享的,因此这将更新两个环境的本地配置文件。 core.eol将确保文本文件在结帐时承担LF行结尾。 core.autocrlf将确保文本文件中的潜在 CRLF(例如,由复制/粘贴操作产生)将在您的存储库中转换为LF。

或者,您可以通过创建包含类似以下内容的.gitattributes文件来帮助Git区分 文本文件:

# Autodetect text files
* text=auto

# ...Unless the name matches the following
# overriding patterns

# Definitively text files 
*.txt text
*.c text
*.h text

# Ensure those won't be messed up with
*.jpg binary
*.data binary

如果您决定创建.gitattributes文件,提交

最后,确保git status提及“无需提交(工作目录清理)”,然后执行以下操作

$ git checkout-index --force --all

这将在您的工作目录中重新创建您的文件,同时考虑您的配置更改和.gitattributes文件,并替换文本文件中任何可能被忽略的CRLF。

完成此操作后,工作目录中的每个文本文件都将带有LF行结尾,而git status仍应将workdir视为干净。

答案 1 :(得分:78)

从git 2.10开始,没有必要单独枚举每个文本文件。 Git np.add.at2.10 fixed the behavior of text=auto together with eol=lf

git存储库根目录中的

.gitattributes文件:

* text=auto eol=lf

添加并提交。

之后,您可以执行以下步骤,现在所有文件都已标准化:

git rm --cached -r .  # Remove every file from git's index.
git reset --hard      # Rewrite git's index to pick up all the new line endings.

来源:Source

答案 2 :(得分:22)

要强制所有文本文件的LF行结尾,您可以使用以下行创建存储库顶层的.gitattributes文件(根据需要更改):

# Ensure all C and PHP files use LF.
*.c         eol=lf
*.php       eol=lf

确保Git认为是文本文件的所有文件在存储库中都有规范化的(LF)行结尾(通常core.eol配置控制默认情况下你有哪一行)。

根据新的属性设置,任何包含CRLF的文本文件都应该由Git规范化。如果这不会自动发生,您可以在更改行结束后手动刷新存储库,这样您就可以通过以下步骤重新扫描并提交工作目录(给定干净的工作目录):

$ echo "* text=auto" >> .gitattributes
$ 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"

或根据GitHub docs

git add . -u
git commit -m "Saving files before refreshing line endings"
git rm --cached -r . # Remove every file from Git's index.
git reset --hard # Rewrite the Git index to pick up all the new line endings.
git add . # Add all your changed files back, and prepare them for a commit.
git commit -m "Normalize all the line endings" # Commit the changes to your repository.

另请参阅:@Charles Bailey post

此外,如果您要排除任何文件不被视为文本,请取消设置其文本属性,例如

manual.pdf      -text

或者将其明确标记为二进制:

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

要查看更高级的git规范化文件,请在.gitattributes处查看Drupal core

# Drupal git normalization
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# @see https://www.drupal.org/node/1542048

# Normally these settings would be done with macro attributes for improved
# readability and easier maintenance. However macros can only be defined at the
# repository root directory. Drupal avoids making any assumptions about where it
# is installed.

# Define text file attributes.
# - Treat them as text.
# - Ensure no CRLF line-endings, neither on checkout nor on checkin.
# - Detect whitespace errors.
#   - Exposed by default in `git diff --color` on the CLI.
#   - Validate with `git diff --check`.
#   - Deny applying with `git apply --whitespace=error-all`.
#   - Fix automatically with `git apply --whitespace=fix`.

*.config  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.css     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.dist    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.engine  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.html    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html
*.inc     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.js      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.json    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.lock    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.map     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.md      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.module  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.php     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.po      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.script  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.sh      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.sql     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.svg     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.theme   text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.twig    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.txt     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.xml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.yml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.eot     -text diff
*.exe     -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff
*.jpg     -text diff
*.otf     -text diff
*.phar    -text diff
*.png     -text diff
*.svgz    -text diff
*.ttf     -text diff
*.woff    -text diff
*.woff2   -text diff

另见: