我有一个Git仓库,它有一些DOS格式的文件(\r\n
行尾)。我想通过dos2unix
运行文件(这会将所有文件更改为UNIX格式,其中\n
行结束),但这会对历史造成多大的影响,是否会推荐?Git:从源代码控制文件中删除回车
我假设标准总是使用UNIX行尾作为源代码控制文件,并且可以选择本地切换到特定于OS的行尾?
我有一个Git仓库,它有一些DOS格式的文件(\r\n
行尾)。我想通过dos2unix
运行文件(这会将所有文件更改为UNIX格式,其中\n
行结束),但这会对历史造成多大的影响,是否会推荐?Git:从源代码控制文件中删除回车
我假设标准总是使用UNIX行尾作为源代码控制文件,并且可以选择本地切换到特定于OS的行尾?
您必须使用的方法取决于您的存储库是如何公开的。
如果您不介意或关心更改所有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
谢谢。现在我是唯一一个在存储库上工作的人,因为它非常“年轻”,所以重写历史记录应该不成问题。但是'git filter-branch'会在github上播放(我已经把存储库放在那里)了? – Blixt 2010-03-18 10:51:33
我想,你必须删除github上的所有分支和标签,以确保它们可以被重新创建。 (它*可能*没有这个工作,但也许重新开始更好。)或者,你删除整个回购,然后再推一次。这应该可以用github找到,除非有人从中克隆。然后他们需要做同样的事情,这取决于他们与git的流畅程度。 – Debilski 2010-03-18 11:08:31
好的。我刚刚删除了存储库,并重新推出了修改过的历史记录。无论如何,我需要解决一些旧的提交消息也是多行的问题。 – Blixt 2010-03-18 11:57:51
对于持续的解决方案,看看在core.autocrlf(和core.safecrlf)config parameters。
这样做一次到您的整个存储库只会创建一个很不可能合并的提交(因为这些文件中的每一行都会被修改),但是一旦您通过它,应该没什么大不了的。 (是的,你可以使用git filter-branch
一直修改历史,但有点可怕)。
当我们从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配置相同。
如果你的版本控制文件的列表包括二进制文件,或者你不能轻易改变历史......这里是一个方便的花花公子的一行:
的兴趣在此人相关的问题: http://stackoverflow.com/questions/446244/are-crlf-lines-ok-in-a-rails-project-deployed-on-linux – Blixt 2010-03-18 11:06:50