我目前正在使用JGit开发Java项目。我仍然没有使用JGit,但我认为它的功能与普通git一样安静。
我尝试做的是从裸git repo分支获取所有非二进制文件和一定大小的文件,并将它们存档为zip文件。对于具有工作目录的repo,此任务可能很简单,因为我只需使用git grep -Ic ''
列出所有非二进制文件,然后将这些文件传递给git archive
,但这对于裸存储库来说是不可行的
非常感谢你的帮助。
答案 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