我曾被Windows/Linux git的行结束问题所困扰。通过GitHub, MSysGit和其他来源,似乎最好的解决方案是让您的本地回购设置为使用linux风格的行结束符,但设置核心。专制是真实的。不幸的是,我没有做到这一点足够早,所以现在每次我拉改变线结束是borked。

我以为我在这里找到了答案,但我不能让它为我工作。我的Linux命令行知识有限,所以我甚至不确定“xargs fromdos”行在他的脚本中起什么作用。我不断收到关于不存在这样的文件或目录的消息,当我设法将其指向一个现有目录时,它告诉我我没有权限。

我已经在Windows和Mac OS X终端上尝试了MSysGit。


当前回答

“| xargs fromdos”从标准输入(文件find查找)中读取,并将其用作fromdos命令的参数,该命令转换行结束符。(fromdos在那些环境中是标准的吗?我习惯使用dos2unix)。注意,你可以避免使用xargs(特别是当你有足够多的文件,而参数列表对于xargs来说太长时):

find <path, tests...> -exec fromdos '{}' \;

or

find <path, tests...> | while read file; do fromdos $file; done

我不是很确定你的错误信息。我成功地测试了这个方法。哪个程序在生成它们?哪些文件/目录您没有权限?不过,下面让我们来猜测一下你的目标是什么:

获取脚本“file not found”错误的一个简单方法是使用相对路径——使用绝对路径。同样,如果你没有让你的脚本可执行(chmod +x),你可能会得到一个权限错误。

添加评论,我会试着帮你解决!

其他回答

如果以上答案都对你不起作用,请按照以下步骤进行:

如果你在Windows上,执行git config—global core。autocrlf正确;如果你在Unix上,执行git config core。autocrlf输入 执行命令git rm——cached -r。 删除.gitattributes文件 运行git add -A 运行git reset -hard

那你的地盘现在应该干净了。

git status --short|grep "^ *M"|awk '{print $2}'|xargs fromdos

解释:

Git状态——短 这将显示git知道和不知道的每一行。不在git控制下的文件在行首用'?'标记。被修改的文件用M标记。 grep "^ *M" 这只会过滤掉那些被修改过的文件。 Awk '{打印$2}' 这只显示没有任何标记的文件名。 xargs fromdos 这将从前面的命令中获取文件名,并通过实用程序'fromdos'运行它们来转换行结束符。

我在一次回购中也遇到了同样的问题。如果你同时使用windows和linux系统进行相同的代码repo和pull和push,试试这个:

首先,设置你的git配置如下:

git config --global core.autocrlf true

这将确保在写入对象数据库时将CRLF转换为LF,然后在写入工作目录时再次将LF替换为CRLF。因此,你的回购将是安全的,只有一种类型的行结束,在本地你将有窗口行结束在windows系统。

对于linux/MAC, git配置如下:

git config --global core.autocrlf input

这将确保在写入对象数据库时将CRLF转换为LF,但不会做相反的事情,保留linux/MAC所需的LF。

对于linux/MAC上已经存在的错误行尾,请使用dos2unix

MAC:

brew install dos2unix # Installs dos2unix Mac
find . -type f -exec dos2unix {} \; # recursively removes windows related stuff

Linux:

sudo apt-get install -y dos2unix # Installs dos2unix Linux
sudo find . -type f -exec dos2unix {} \; # recursively removes windows related stuff

希望这能解决你的问题。

以下是我如何使用git filter-branch在整个历史中固定所有的行结尾。^M字符需要使用CTRL-V + CTRL-M输入。我使用dos2unix来转换文件,因为这会自动跳过二进制文件。

$ git filter-branch --tree-filter 'grep -IUrl "^M" | xargs -I {} dos2unix "{}"'

“| xargs fromdos”从标准输入(文件find查找)中读取,并将其用作fromdos命令的参数,该命令转换行结束符。(fromdos在那些环境中是标准的吗?我习惯使用dos2unix)。注意,你可以避免使用xargs(特别是当你有足够多的文件,而参数列表对于xargs来说太长时):

find <path, tests...> -exec fromdos '{}' \;

or

find <path, tests...> | while read file; do fromdos $file; done

我不是很确定你的错误信息。我成功地测试了这个方法。哪个程序在生成它们?哪些文件/目录您没有权限?不过,下面让我们来猜测一下你的目标是什么:

获取脚本“file not found”错误的一个简单方法是使用相对路径——使用绝对路径。同样,如果你没有让你的脚本可执行(chmod +x),你可能会得到一个权限错误。

添加评论,我会试着帮你解决!