处理Git项目当中既有Windows文件又有Linux/Unix/MacOS文件的问题
处理Git项目当中既有Windows文件又有Linux/Unix/MacOS文件的问题
写这篇文章的目的主要是为了解决gradle项目里面既有BAT文件又有shell脚本的问题。
我们一般在处理git的line ending时,一般会把core.autocrlf
设置为input
模式:
$ git config --global core.autocrlf
input
input模式的含义是:不管当前工作目录下的文本文件使用的EOL(end of line)是CRLF
还是LF
,commit回库时都会转化为LF
。这样,保证了在git的仓库中的代码使用的EOL都是LF
。这样对于Unix(以及Linux和MacOS)环境下是适用的。
但有的时候,我们的代码仓库可能同时包含Windows环境下和Unix使用的文件,比如Gradle项目就是很好的例子,它同时包含Windows的.BAT文件和Linux的脚本文件:
$ tree
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
2 directories, 5 files
在这种情况下,很显然gradlew.bat
应该是保持CRLF
的EOL,commit进库是不应该被转化为LF
。如果我们强行签入,git也会报错:
$ git add *
fatal: CRLF would be replaced by LF in gradlew.bat.
因此,我们需要一种机制,让git对gradlew.bat做特殊处理。解决的方法就是在项目中添加一个.gitattributes
1文件,文件内容如下:
$ cat ./.gitattributes
*.bat -text
这样,我们把*.bat
文件标记为-text
,git也就不会把这类文件识别成代码文件,也就不再自动处理这类文件的EOL,而是保持它本来的样子签入。因此加入了.gitattributes
的相关配置以后,git就可以正确添加.bat文件,不再报错。
-
https://help.github.com/articles/dealing-with-line-endings/ ↩