我正在使用JGit作爲我的項目,我必須維護用戶上傳的文件。 如果文件已經存在,那麼它會創建一個相同的新版本,並將客戶與他提交/上傳的一組文件相關聯。JGit可伸縮性限制
它在本地工作文件,即每個文件上載,將其提交到存儲庫,即在服務器機器上,並且添加記錄在DB中的相同文件,以關聯客戶及其各自的文件版本控制列表,即commitIds。
但是,在上傳文件迭代很少(每次上傳可能包含大約200個文件)後,JGit能夠提交文件並正確生成commitIds,但無法在向用戶顯示其提交的文件時檢索文件的內容。
遺憾的是,日誌在檢索文件時不會顯示任何錯誤。
因此,我迷路了......並且努力理解站在這兒出了什麼問題。
我的問題是:
是否JGIT有足夠的可擴展性?即提取時間會隨着它的增長而變得足夠快?
如果我正確檢索文件該怎麼辦。
下面是一段代碼,我使用
FileUtils.copyFile(aFile,destFile);
AddCommand add = git.add();
add.addFilepattern(".").call();
CommitCommand commit = git.commit();
commit.setAuthor(user.getFirstName(), user.getUserId());
commit.setMessage("comments").call();
ObjectId lastCommitId = git.getRepository().resolve(org.eclipse.jgit.lib.Constants.HEAD);
以上destFile是Git倉庫和å文件是文件名
使用lastCommitId我試圖以檢索的內容但我得到的文件:
MissingObjectException: Missing unknown 0000000000000000000000000000000000000000
用於檢索文件的代碼是:
ObjectId lastCommitId = repo.resolve(lastCommitId);
RevTree tree = commit.getTree();
TreeWalk treeWalk = new TreeWalk(repo);
treeWalk.addTree(tree);
treeWalk.setRecursive(true);
treeWalk.setFilter(PathFilter.create("actial_File_Name")); //this is actual file name i used
boolean next = treeWalk.next();
if (next)
{
ObjectId objectId = treeWalk.getObjectId(0);
log.logError(" objectId :" + objectId);
try{
ObjectLoader loader = repo.open(objectId);
OutputStream out = new FileOutputStream(targetFile); ///targetFile is the actual file name i wanted to retreive the content i.e orginal name
loader.copyTo(out);
}
}
謝謝AlBlue,但是爲什麼首先在存儲庫中存在具有該commitId的對象時獲取zeroId?如何避免「MissingObjectException:遺漏未知的0000000000000000000000000000000000000000」? – user2907154
在你的代碼中,你是否試圖在生成它的同一個進程中獲得提交? 我注意到,你似乎沒有做一個'call()',它實際上會把它保存到數據庫中。因此,任何嘗試打開該提交都會生成一個丟失的對象異常,因爲提交的id在用'call()'提交之前是'0000 ...'。 – AlBlue