从git仓库列出或存档非二进制文件

时间:2016-11-21 16:07:11

标签: java git jgit

我目前正在使用JGit开发Java项目。我仍然没有使用JGit,但我认为它的功能与普通git一样安静。

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

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用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相同的启发式方法来确定给定内容是二进制还是文本。

答案 1 :(得分:0)

该命令名为git archive,它比打扰工作区更好。

您可以使用export-ignore attribute排除不需要的文件,回复本地.git/info/attributes(或者像您所拥有的只有info/attributes这样的裸仓库)可以很方便。此外,git ls-files|git check-attr --stdin --all是一个方便的入门套件,用于查找标记了什么或任意提交的内容(git ls-tree -r --name-only your.ref.here|git check-attr -a --stdin)。

您可以将任意模式放入属性文件中,例如

*.jpg export-ignore