JGit 支持转义分支名称

JGit support to escape branch names

当使用 to set a branch name with illegal characters (outlined here) 像这样:

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

它会生成低级 git 错误。

理想情况下,我可以避免直接在我的代码中编码那些无效字符。 JGit 是否具有 escape/replace/strip 无效字符的功能?

更新 2017-01-27:因为 this commit 有一个静态方法 Repository::normalizeBranchName() 转义给定的字符串以形成有效的引用名称和returns吧。更改将与 JGit v4.7.

一起发布

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

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

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

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;
}