我有一个Git存储库,其中一些文件采用DOS格式(\r\n
行结尾)。 我想只需通过运行文件进行dos2unix
(这将把所有文件更改为UNIX格式,带有\n
行结尾),但这会对历史记录产生多大影响,是否推荐这样做?
我认为标准是始终使用UNIX行结尾的源代码控制文件,并在本地选择特定于操作系统的行结尾。
我有一个Git存储库,其中一些文件采用DOS格式(\r\n
行结尾)。 我想只需通过运行文件进行dos2unix
(这将把所有文件更改为UNIX格式,带有\n
行结尾),但这会对历史记录产生多大影响,是否推荐这样做?
我认为标准是始终使用UNIX行结尾的源代码控制文件,并在本地选择特定于操作系统的行结尾。
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具有相同的配置。你需要采用的方法取决于你的代码库是否公开。
如果你不介意或者并不关心更改所有的SHAs(Git版本号),因为你是唯一使用它的人,但是想要一劳永逸地解决这个问题,你可以运行git filter-branch
命令,并对每个提交中的所有文件应用dos2unix
命令。(如果你共享代码库,则其他人需要彻底更新它,所以这可能有潜在风险。)
因此,更好的选择也更容易的方法是仅在当前提交中进行更改。这意味着您过去的提交仍然具有\r\n
换行符,但除非您从过去大量合并提交,否则这不应该是问题。当然,差异工具可能会稍微多报告一些警告,但通常你只和相邻的提交比较,随着提交的积累,这个问题就解决了。
而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会有什么样的兼容性(我已经将代码库放在GitHub上了)? - Blixtgit filter-branch --tree-filter 'grep -Irl --exclude-dir=.git "" . | xargs sudo dos2unix -p' HEAD
。 - Blixtgit filter-branch
来使修改在整个历史记录中生效,但这有点可怕。)如果您的版本控制文件列表包括二进制文件,或者您无法轻松更改历史记录... 这里有一个方便的单行代码: