如何用jgit做相当于“git repack -ad”的操作?

时间:2012-11-20 15:42:46

标签: jgit

我使用jgit-2.0.0.201206130900实现了DfsRepository。它工作得很好,但我想重新打包它,所以我只有一个packfile。我如何通过jgit做到这一点?

1 个答案:

答案 0 :(得分:0)

有这个工作。 DfsGarbageCollector基本上相当于repack -d。要获得repack -a行为,请使用DfsPackCompactor

void repack(DfsRepository repo) throws IOException {
    DfsGarbageCollector gc = new DfsGarbageCollector(repo);
    gc.pack(null);

    // update the list of packs for getPacks() below
    // otherwise not all packs are compacted
    repo.scanForRepoChanges();

    // only compact if there are multiple pack files
    DfsPackFile[] packs = repo.getObjectDatabase().getPacks();

    if (packs.length > 1) {
        DfsPackCompactor compactor = new DfsPackCompactor(repo);

        for (DfsPackFile pack : packs) {
            compactor.add(pack);
        }

        compactor.compact(null);
    }
}

但这并不是全部。

DfsGarbageCollector为垃圾创建一个单独的包文件。

我发现“删除”垃圾包文件的最简单方法是从我的DfsOutputStream实现中返回DfsObjDatabase.writePackFile(),如果包文件的源为PackSource.UNREACHABLE_GARBAGE,则只会丢弃数据。