java - 从 git repo 列出或归档非二进制文件

标签 java git jgit

我目前正在使用 JGit 开发一个 Java 项目。我仍然没有使用 JGit,但我假设它的功能会像普通 git 一样安静。

我想做的是从裸 git repo 分支中获取所有非二进制文件和特定大小以下的文件,并将它们存档在一个 zip 文件中。对于具有工作目录的存储库来说,此任务可能很简单,因为我可以简单地使用 git grep -Ic '' 列出所有非二进制文件,然后将这些文件传递给 git archive,但是这对于裸存储库是不可行的。

非常感谢您的帮助。

最佳答案

您可以使用 JGit 的 ArchiveCommand 来生成存档。它的 setPaths() 方法允许您只选择要包含的某些路径。

为了组装路径列表,您需要分析要归档的提交树。例如:

TreeWalk treeWalk = new TreeWalk( repository );
treeWalk.setRecursive( true );
treeWalk.addTree( commit.getTree() );
while( treeWalk .next() ) {
  if( !isBinary( treeWalk ) {
    filesToArchive.add( treeWalk.getPathString() );
  }
}
treeWalk.close();

示例代码遍历要归档的提交的整个树,获取树中每个文件的内容并调用虚构的isBinary() 方法来确定其内容是文本还是二进制.所有非二进制文件都添加到可以传递给 ArchiveCommandfilesToArchive 集合中。

对于 isBinary() 实现,您可能会成功地使用 JGit 的属性支持:

Attributes attributes = new AttributesHandler( treeWalk ).getAttributes();
boolean binary = attributes.isSet( "binary" );

AttributesHandler::getAttributes() 返回由 treeWalk 表示的当前路径的merged 属性。

或者,您可以使用 RawText::isBinary() 来实现 isBinary() 方法,如下所示:

ObjectId blobId = treeWalk.getObjectId( 0 );
ObjectReader objectReader = repository.newObjectReader();
ObjectLoader objectLoader = objectReader.open( blobId );
byte[] bytes = objectLoader.getBytes();
objectReader.close();
boolean binary = RawText.isBinary( bytes );

RawText::isBinary 使用与 native Git 相同的启发式方法来确定给定内容是二进制还是文本。

关于java - 从 git repo 列出或归档非二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724449/

相关文章:

java - Quartz 预定作业未触发 - 可能未处理的异常?

java - 是否可以将数组作为枚举中的属性?有编译时错误

java - 如何使用 Eclipse JDT 代码格式化程序在方法和类型注释之后插入新行?

python - 通过requirements.txt正确安装依赖项或如何正确安装已编辑的依赖项

java - 如何使用 JGit 找到提交的分支?

Java:如何在未修饰的 JFrame 周围绘制边框?

git - Travis-CI 构建根本不会根据 pull 请求启动

git - 在 Heroku 上克隆以前的版本

git - 使用 JGit 使现有的 Git 分支跟踪远程分支?

java - 如何计算 JGit 中插入/删除的行数