我在github上托管了一个git存储库。许多文件最初是在Windows上开发的,我对行结尾并不太谨慎。当我执行初始提交时,我也没有任何git配置来强制执行正确的行结束。结果是我的github存储库中有许多带有CRLF行结尾的文件。
我现在部分在Linux上开发,我想清理行结尾。如何确保文件在github上使用LF正确存储,并在我的工作副本中使用LF?
我已设置.gitattributes
个文件,其中包含text eol=LF
;那是对的吗?有了这个承诺和推动,我可以rm
我的本地仓库并从github重新克隆以获得预期的效果吗?
答案 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.at
。 2.10 fixed the behavior of text=auto together with eol=lf
.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
另见: