Java循环添加文件_java – 使用jGit循环提交文件
我已經(jīng)成功地掌握了jGit文件的基礎(chǔ)知識,包括連接到repos以及添加,提交甚至循環(huán)文件的提交消息.
File gitDir = new File("/Users/myname/Sites/helloworld/.git");
RepositoryBuilder builder = new RepositoryBuilder();
Repository repository;
repository = builder.setGitDir(gitDir).readEnvironment()
.findGitDir().build();
Git git = new Git(repository);
RevWalk walk = new RevWalk(repository);
RevCommit commit = null;
// Add all files
// AddCommand add = git.add();
// add.addFilepattern(".").call();
// Commit them
// CommitCommand commit = git.commit();
// commit.setMessage("Commiting from java").call();
Iterable logs = git.log().call();
Iterator i = logs.iterator();
while (i.hasNext()) {
commit = walk.parseCommit( i.next() );
System.out.println( commit.getFullMessage() );
}
我接下來要做的是能夠獲取單個文件的所有提交消息,然后能夠?qū)蝹€文件還原回特定的參考/時間點.
解決方法:
以下是如何根據(jù)所有父提交查找提交的更改
var tree = new TreeWalk(repository)
tree.addTree(commit.getTree)
commit.getParents foreach {
parent => tree.addTree(parent.getTree)
}
tree.setFilter(TreeFilter.ANY_DIFF)
(斯卡拉碼)
請注意,TreeFilter.ANY_DIFF適用于單個樹步行者,并將返回根提交中可用的所有元素.
然后,您必須遍歷樹以查看您的文件是否在給定的delta中(這非常簡單).
while (tree.next)
if (tree.getDepth == cleanPath.size) {
// we are at the right level, do what you want
} else {
if (tree.isSubtree &&
name == cleanPath(tree.getDepth)) {
tree.enterSubtree
}
}
}
(cleanPath是純粹的repo路徑,由’/’分隔)
現(xiàn)在將該代碼包裝到RevWalk.next循環(huán)中,您將獲得提交更改的提交和文件.
您可能希望使用與ANY_DIFF不同的過濾器,因為如果一棵樹不同,則ANY_DIFF為真.如果合并中blob與所有父樹相比沒有變化,則這有點違反直覺.所以這里是ALL_DIFF的核心,它只顯示與所有父樹不同的元素:
override def include(walker: TreeWalk): Boolean = {
val n = walker.getTreeCount();
if (n == 1) {
return true;
}
val m = walker.getRawMode(0)
var i = 1
while (i < n) {
if (walker.getRawMode(i) == m && walker.idEqual(i, 0)) {
return false
}
i += 1
}
true
}
(scala代碼,派生自AnyDiffFilter)
標簽:jgit,java
來源: https://codeday.me/bug/20191004/1852205.html
總結(jié)
以上是生活随笔為你收集整理的Java循环添加文件_java – 使用jGit循环提交文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用java做出两行三列的表格_Java中
- 下一篇: java中删除node节点_[Java]