首页 > 解决方案 > 是否可以使用 JGit 的内存存储库将一个小文件添加到一个大的 Git 存储库而无需在本地签出?

问题描述

我有一个大型(数 GB)Git 存储库。我希望一些应用程序在该存储库中创建小文件并提交更改。这应该在不检查那些千兆字节到磁盘的情况下发生。

我找到了一个 JGit代码示例,其中远程存储库被克隆到内存存储库中。

我可以使用 JGit(如下所示)将文件添加到远程存储库而不在本地签出(即不将千兆字节的数据传输到运行该代码的机器上)吗?

DfsRepositoryDescription repoDesc = new DfsRepositoryDescription();
InMemoryRepository repo = new InMemoryRepository(repoDesc);
Git git = new Git(repo);
git.remoteAdd();
git.commit();

更新 1:整个目录(跟踪文件加上.git)的大小为1.2G. 单独的大小.git是573M。

% du -hs .
1.2G    .
% du -hs .git
573M    .git

标签: javagitjgit

解决方案


请注意,RAM 中的结帐将从远程下载完全相同的数据。克隆完成后,它将仅1,2G在 RAM 中使用,而不是在磁盘上使用。

您可能还想了解如何使用 JGit api 创建和添加“文件”,看看它是否是一种方便的方式来将您想要的数据添加到您的存储库中。


如果你想限制从你的 git 服务器下载的东西的数量:你可以创建一个浅克隆。
例如,请参阅此 SO 答案

git clone --depth 1 <repo_url> -b <branch_name>

这将下载最新提交的内部文件(在您的情况下为 500M 的压缩版本),并运行此提交的实际签出(500M)。

您可以根据需要在磁盘或 RAM 中运行它。

在您的情况下,这仍然需要 600-700M 的使用量,在 RAM 或磁盘上,包括签出的文件,
但它只会下载 ~100M(我猜:通过运行浅克隆检查实际大小来自您的工作站的命令)来自服务器的头部提交的压缩版本。


推荐阅读