我目前正在使用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()
方法来确定其内容是文本还是二进制。所有非二进制文件都添加到可以传递给filesToArchive
的ArchiveCommand
集合中。对于
isBinary()
实现,您可以成功使用JGit的属性支持:Attributes attributes = new AttributesHandler( treeWalk ).getAttributes();
boolean binary = attributes.isSet( "binary" );
AttributesHandler::getAttributes()
返回由treeWalk
表示的当前路径的合并属性。或者,您可以使用
RawText::isBinary()
来实现isBinary()
方法,如下所示:ObjectId blobId = getObjectId( 0 );
ObjectReader objectReader = repository.newObjectReader();
ObjectLoader objectLoader = objectReader.open( blobId );
byte[] bytes = objectLoader.getBytes();
objectReader.close();
booloean binary = RawText.isBinary( bytes );
RawText::isBinary
使用与本地Git相同的试探法来确定给定的内容是二进制还是文本。