git-commit-id-plugin为何扫描.git外目录?非ASCII文件名报错
git-commit-id-plugin扫描非.git目录的原因及编码报错解决
问题场景
使用git-commit-id-plugin 2.2.6,配置如下:
<plugin> <groupId>pl.project13.maven</groupId> <artifactId>git-commit-id-plugin</artifactId> <version>2.2.6</version> <executions> <execution> <id>get-the-git-infos</id> <goals> <goal>revision</goal> </goals> </execution> </executions> <configuration> <dotGitDirectory>${project.basedir}/.git</dotGitDirectory> <prefix>git</prefix> <verbose>false</verbose> <generateGitPropertiesFile>true</generateGitPropertiesFile> <generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties </generateGitPropertiesFilename> <gitDescribe> <skip>false</skip> <always>false</always> <dirty>-dirty</dirty> </gitDescribe> </configuration> </plugin>
执行命令 mvn pl.project13.maven:git-commit-id-plugin:2.2.6:revision 时触发报错:
[INFO] --- git-commit-id-plugin:2.2.6:revision (get-the-git-infos) Malformed input or input contains unmappable characters: myProject/documentation/������.odt.
原文件名为俄文「Дискуссия_ТЗ_2.odt」,改为英文「Discussion_TZ_2.odt」后问题解决,疑问是插件为何会扫描非.git目录。
原因说明
git-commit-id-plugin在启用脏状态检测时,会遍历整个Git工作区的文件(而非仅.git目录):
- 你配置了
<gitDescribe><dirty>-dirty</dirty></gitDescribe>,这会让插件检测仓库是否处于脏状态(存在未提交的文件变更) - 为了判断脏状态,插件需要扫描工作区所有文件,包括
documentation目录下的文件 - 当系统默认编码不支持文件名中的非ASCII字符(如俄文)时,就会触发编码转换异常,抛出「Malformed input...」错误
解决方法
1. 临时快速解决
将包含非ASCII字符的文件名改为英文或ASCII兼容名称,如你已操作的那样。
2. 配置层面优化(无需修改文件名)
方法A:关闭脏状态检测
如果不需要在版本信息中标记脏状态,可在插件配置中添加以下参数,避免扫描工作区文件:
<configuration> <!-- 保留原有其他配置 --> <checkDirty>false</checkDirty> </configuration>
或修改gitDescribe配置,跳过脏标记:
<gitDescribe> <!-- 保留原有其他配置 --> <dirty></dirty> </gitDescribe>
方法B:指定编码支持非ASCII字符
在执行Maven命令时添加编码参数,确保插件能正确解析非ASCII文件名:
mvn pl.project13.maven:git-commit-id-plugin:2.2.6:revision -Dfile.encoding=UTF-8
也可在项目pom.xml中全局配置编码:
<properties> <file.encoding>UTF-8</file.encoding> </properties>
内容的提问来源于stack exchange,提问作者IlHam13
相关产品推荐
相关产品推荐

