我目前正在使用 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()
方法来确定其内容是文本还是二进制.所有非二进制文件都添加到可以传递给 ArchiveCommand
的 filesToArchive
集合中。
对于 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/