我有一个Git存储库,其中包含一些DOS格式的文件(\r\n
行结尾)。我想通过dos2unix
运行文件(这会将所有文件更改为UNIX格式,并使用\n
行结尾),但这会对历史产生多大影响,是否建议使用?< / p>
我认为标准是始终将UNIX行结尾用于源控制文件,并可选择在本地切换到特定于操作系统的行结尾?
答案 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)
如果您的版本控制文件列表包含二进制文件,或者您无法轻松更改历史记录...这里有一个方便的花花公子: