2010-03-18 53 views
15

我有一个Git仓库,它有一些DOS格式的文件(\r\n行尾)。我想通过dos2unix运行文件(这会将所有文件更改为UNIX格式,其中\n行结束),但这会对历史造成多大的影响,是否会推荐?Git:从源代码控制文件中删除回车

我假设标准总是使用UNIX行尾作为源代码控制文件,并且可以选择本地切换到特定于OS的行尾?

+1

的兴趣在此人相关的问题: http://stackoverflow.com/questions/446244/are-crlf-lines-ok-in-a-rails-project-deployed-on-linux – Blixt 2010-03-18 11:06:50

回答

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 
+0

谢谢。现在我是唯一一个在存储库上工作的人,因为它非常“年轻”,所以重写历史记录应该不成问题。但是'git filter-branch'会在github上播放(我已经把存储库放在那里)了? – Blixt 2010-03-18 10:51:33

+0

我想,你必须删除github上的所有分支和标签,以确保它们可以被重新创建。 (它*可能*没有这个工作,但也许重新开始更好。)或者,你删除整个回购,然后再推一次。这应该可以用github找到,除非有人从中克隆。然后他们需要做同样的事情,这取决于他们与git的流畅程度。 – Debilski 2010-03-18 11:08:31

+0

好的。我刚刚删除了存储库,并重新推出了修改过的历史记录。无论如何,我需要解决一些旧的提交消息也是多行的问题。 – Blixt 2010-03-18 11:57:51

4

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

这样做一次到您的整个存储库只会创建一个很不可能合并的提交(因为这些文件中的每一行都会被修改),但是一旦您通过它,应该没什么大不了的。 (是的,你可以使用git filter-branch一直修改历史,但有点可怕)。

22

当我们从svn转换到git(在一个中央(裸)像),这crlf的事情让我们疯狂, scm环境。最终得到的结果是,我们将全局.gitconfig文件复制到每个人的用户根目录(是Windows和Linux),最初来自Windows系统,core.autocrlf = true和core.safecrlf = false,在Linux用户上(比如bash脚本无法运行,以及所有这些可怕的^ M)。所以我们最初做了一个签出和克隆脚本,在这些命令后执行了dos2unix。然后,我运行core.autocrlf和core.safecrlf配置项并根据O/S进行设置:

Windows:core.autocrlf = true and core.safecrlf = false Linux:core.autocrlf = input and核心。safecrlf =假

这些条带: ---在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 . 

他们只需要在本地sa上运行ndbox克隆一次。任何未来的克隆都正确完成。现在任何未来推送都被正确处理。所以,这解决了我们的多个O/S问题与换行。另请注意,Mac与Linux配置相同。