JGit支持转义分支名称

时间:2016-06-30 19:26:07

标签: jgit

使用设置包含非法字符的分支名称(概述为here),如下所示:

git.checkout().setName("......my:bad:branch:name")

它会生成一个低级别的git错误。

理想情况下,我可以避免直接在代码中编码这些无效字符。 JGit是否具有转义/替换/删除无效字符的任何功能?

1 个答案:

答案 0 :(得分:1)

更新2017-01-27 :由于this commit有一个静态方法Repository::normalizeBranchName(),它会转义给定字符串以形成有效的引用名称并返回它。这些更改将通过JGit v4.7发布。

对于早期版本的JGit,必须手动转义名称。

使用Repository::isValidRefName(),您可以确定给定的字符串是否是有效的Git引用名称。 documentation for git check-ref-format详细描述了有效的引用名称必须符合的规则。

我在一个项目中使用此方法,用一个下划线替换所有可疑字符(可能有一些不准确):

String DOT_LOCK = ".lock";
String REPLACEMENT = "_";

String escapeRefName( String refName ) {
  String result = refName;
  if( result.endsWith( DOT_LOCK ) ) {
    result = result.substring( 0, result.length() - DOT_LOCK.length() );
  }
  result = result.replace( " ", REPLACEMENT );
  result = result.replace( "\\", REPLACEMENT );
  result = result.replace( "/", REPLACEMENT );
  result = result.replace( "^", REPLACEMENT );
  result = result.replace( "@", REPLACEMENT );
  result = result.replace( "{", REPLACEMENT );
  result = result.replace( "}", REPLACEMENT );
  result = result.replace( "~", REPLACEMENT );
  result = result.replace( "*", REPLACEMENT );
  result = result.replace( "?", REPLACEMENT );
  result = result.replace( ":", REPLACEMENT );
  result = result.replace( "[", REPLACEMENT );
  result = result.replace( ".", REPLACEMENT );
  result = result.replace( "\u007F", REPLACEMENT );
  return result;
}