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

时间:2010-03-18 00:54:08

标签: git version-control dos2unix

我有一个Git存储库,其中包含一些DOS格式的文件(\r\n行结尾)。我想通过dos2unix运行文件(这会将所有文件更改为UNIX格式,并使用\n行结尾),但这会对历史产生多大影响,是否建议使用?< / p>

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

4 个答案:

答案 0 :(得分:24)

当我们从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

---在Linux ---

git config --global core.autocrlf input
git config --global core.safecrlf false

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

#!/bin/sh
# remove local tree
git ls-files -z | xargs -0 rm
# checkout with proper crlf
git checkout .

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

答案 1 :(得分: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

答案 2 :(得分:4)

对于持续的解决方案,请查看core.autocrlf(和core.safecrlf)config parameters

对整个存储库执行此操作只会创建一个非常不可能合并的提交(因为这些文件中的每一行都将被修改),但是一旦你通过它,它应该没什么大不了的。 (是的,您可以使用git filter-branch在历史记录中进行修改,但这有点可怕。)

答案 3 :(得分:0)

如果您的版本控制文件列表包含二进制文件,或者您无法轻松更改历史记录...这里有一个方便的花花公子:

https://unix.stackexchange.com/a/365679/112190