我曾被Windows/Linux git的行结束问题所困扰。通过GitHub, MSysGit和其他来源,似乎最好的解决方案是让您的本地回购设置为使用linux风格的行结束符,但设置核心。专制是真实的。不幸的是,我没有做到这一点足够早,所以现在每次我拉改变线结束是borked。
我以为我在这里找到了答案,但我不能让它为我工作。我的Linux命令行知识有限,所以我甚至不确定“xargs fromdos”行在他的脚本中起什么作用。我不断收到关于不存在这样的文件或目录的消息,当我设法将其指向一个现有目录时,它告诉我我没有权限。
我已经在Windows和Mac OS X终端上尝试了MSysGit。
我处理行尾的程序如下(在多次回购中进行了战斗测试):
当创建一个新的repo时:
将.gitignore和README.md等典型文件放在第一次提交时。gitignore
在处理现有的回购时:
Create / modify .gitattributes accordingly
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n (--no-verify is to skip pre-commit hooks)
I have to do it often enough that I defined it as an alias alias fixCRLF="..."
repeat the previous command
yep, it's voodoo, but generally I have to run the command twice, first time it normalizes some files, second time even more files. Generally it's probably best to repeat until no new commit is created :)
go back-and-forth between the old (just before normalization) and new branch a few times. After switching the branch, sometimes git will find even more files that need to be renormalized!
在.gitattributes中,我显式地声明所有文本文件具有LF EOL,因为通常Windows工具与LF兼容,而非Windows工具与CRLF不兼容(甚至许多nodejs命令行工具都假设LF,因此可以更改文件中的EOL)。
.gitattributes的内容
我的.gitattributes通常是这样的:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
要了解git在当前回购中跟踪哪些不同的扩展,请查看这里
正常化后的问题
一旦完成,还有一个更常见的警告。
假设您的master已经是最新的和规范化的,然后签出过时的分支。通常在签出分支之后,git会将许多文件标记为已修改。
解决方案是做一个假提交(git add -A。&& git commit -m 'fake commit'),然后git rebase master。在rebase之后,假提交应该会消失。
我处理行尾的程序如下(在多次回购中进行了战斗测试):
当创建一个新的repo时:
将.gitignore和README.md等典型文件放在第一次提交时。gitignore
在处理现有的回购时:
Create / modify .gitattributes accordingly
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n (--no-verify is to skip pre-commit hooks)
I have to do it often enough that I defined it as an alias alias fixCRLF="..."
repeat the previous command
yep, it's voodoo, but generally I have to run the command twice, first time it normalizes some files, second time even more files. Generally it's probably best to repeat until no new commit is created :)
go back-and-forth between the old (just before normalization) and new branch a few times. After switching the branch, sometimes git will find even more files that need to be renormalized!
在.gitattributes中,我显式地声明所有文本文件具有LF EOL,因为通常Windows工具与LF兼容,而非Windows工具与CRLF不兼容(甚至许多nodejs命令行工具都假设LF,因此可以更改文件中的EOL)。
.gitattributes的内容
我的.gitattributes通常是这样的:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
要了解git在当前回购中跟踪哪些不同的扩展,请查看这里
正常化后的问题
一旦完成,还有一个更常见的警告。
假设您的master已经是最新的和规范化的,然后签出过时的分支。通常在签出分支之后,git会将许多文件标记为已修改。
解决方案是做一个假提交(git add -A。&& git commit -m 'fake commit'),然后git rebase master。在rebase之后,假提交应该会消失。
“| 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),你可能会得到一个权限错误。
添加评论,我会试着帮你解决!