Git:从源控制文件中删除回车符

Bli*_*ixt 15 git version-control dos2unix

我有一个Git存储库,它有一些DOS格式的文件(\r\n行结尾).我想只运行文件dos2unix(这会将所有文件更改为UNIX格式,带有\n行结尾),但这会对历史产生多大影响,是否建议使用?

我假设标准是始终将UNIX行结尾用于源控制文件,并可选择在本地切换到特定于操作系统的行结尾?

pn1*_*ude 25

当我们从svn转换为git(在一个中央(裸))scm环境中时,这个crlf的东西让我们疯狂.最终得到我们的是我们将全局.gitconfig文件复制到每个人的用户root(是的windows和linux),其中最初的一个来自Windows系统并且core.autocrlf = true而core.safecrlf = false这会造成浩劫在Linux用户(如bash脚本不起作用,所有那些可怕的^ M).所以我们最初做了一个checkout和clone脚本,在这些命令之后执行了dos2unix.然后我跑过core.autocrlf和core.safecrlf配置项并根据操作系统设置它们:

Windows:core.autocrlf = true和core.safecrlf = false Linux:core.autocrlf = input和core.safecrlf = false

这些设置为:---在Windows上---

git config --global core.autocrlf true
git config --global core.safecrlf false
Run Code Online (Sandbox Code Playgroud)

---在Linux上---

git config --global core.autocrlf input
git config --global core.safecrlf false
Run Code Online (Sandbox Code Playgroud)

然后,对于我们的Linux开发人员,我们设置了一个小的bash脚本/ usr/local/bin/gitfixcrlf:

#!/bin/sh
# remove local tree
git ls-files -z | xargs -0 rm
# checkout with proper crlf
git checkout .
Run Code Online (Sandbox Code Playgroud)

他们只需要在本地沙箱克隆上运行一次.任何未来的克隆都是正确完成的.现在任何未来的推拉都得到了正确处理.因此,这解决了我们使用换行的多个操作系统问题.另请注意,Mac与Linux配置相同.


Deb*_*ski 10

您必须使用的方法取决于您的存储库的公开程度.

如果您不介意或不关心更改所有SHA,因为您或多或少是唯一一个使用它但希望始终整理此问题的人,您可以运行git filter-branch并应用于dos2unix每个提交中的所有文件.(如果您正在共享存储库,则其他所有人都需要或多或少地完全更新它,因此这有潜在危险.)

因此,更好的选择以及更简单的方法是仅在当前的头部改变它.这意味着你过去的提交仍然有\r\n结局,但除非你从过去做很多挑选,否则这应该不是问题.当然,diff工具可能会更频繁地抱怨,但通常你只会在附近进行提交,因此这个问题会随着提交的累积而自行解决.

并且UNIX行结尾是标准的,你是正确的.最好的方法是将编辑器设置为仅在Windows上编写这些结尾.否则,autocrlf您还可以使用一个设置.


除了历史改写部分:

上次我做了同样的事情,我使用以下命令将所有文件更改为unix结尾.

#!/bin/bash
all2dos() { find * -exec dos2unix {} \; }
export -f all2dos
git filter-branch -f --tree-filter 'all2dos' --tag-name-filter cat --prune-empty -- --all
Run Code Online (Sandbox Code Playgroud)

  • git可以识别文件是否是文本文件?Coz dos2unix不能用于二进制文件,那么在包含文本文件和二进制文件的GIT仓库中运行时如何工作呢? (3认同)