在连接到仓库以及添加,提交甚至循环提交文件的消息方面,我已经设法掌握了jGit文件的基础知识。
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<RevCommit> logs = git.log().call();
Iterator<RevCommit> i = logs.iterator();
while (i.hasNext()) {
commit = walk.parseCommit( i.next() );
System.out.println( commit.getFullMessage() );
}
我接下来要做的是能够获取单个文件的所有提交消息,然后能够将单个文件还原回特定的参考/时间点。
这是基于所有父提交查找提交更改的方法
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适用于单个树遍历器,并将返回根提交中可用的所有元素。
然后,您将不得不遍历树以查看您的文件是否在给定的增量中(这很简单)。
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是纯存储库路径,用“ /”分隔)
现在,将该代码包装到RevWalk.next循环中,您将获得提交和由提交更改的文件。
您可能要使用与ANY_DIFF不同的过滤器,因为如果一棵树不同,则ANY_DIFF为true。在合并的情况下,与所有父树相比,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
}
(标量代码,从AnyDiffFilter派生)
问题内容: 我一直在研究将要集成Git功能的基于Java的产品。使用Git的功能之一,我通过分阶段执行将10多个文件添加到Git存储库中,然后在一次提交中提交了这些文件。 以上过程可能相反吗?即查找作为提交的一部分提交的文件列表。 我在命令的帮助下获得了提交,但是我不确定如何获取提交的文件列表。 示例代码: 问题答案: 每个提交都指向一 棵树 ,该 树 表示构成该提交的所有文件。注意,这不仅包括使
我一直在开发一个基于Java的产品,Git特性将被集成到该产品中。通过使用Git的一个特性,我将10个文件添加到Git存储库中,然后在一次提交中提交。 上述过程是否可能相反?即查找作为提交的一部分提交的文件列表。 我在< code>git.log()命令的帮助下获得了提交,但是我不确定如何获得提交的文件列表。 示例代码:
问题内容: 我正在尝试使用JGit来获取从上次提交到最近未提交的更改的文件差异。我该如何使用JGit?(使用命令行将是的输出git diff HEAD) 经过几次讨论(link1,link2),我附带了一段代码,该代码可以查找未提交的文件,但无法获取文件的区别 更新 这个问题是很久以前的。我现有的for确实显示了未提交的代码。prepareTreeParser在显示差异的上下文中,我正在使用的当前
JGit初学者问题: 我使用JGit从存储库读取文件(BLOB)并操作其内容。之后,我想将具有相同文件名的新内容作为新提交写回存储库。但是如何使用JGit提交新内容? 我的伪代码: 我是否必须将 写入一个文件,并使用 AddCommand 和 CommitCommand 提交此文件?或者,我可以将 String“即时”写入具有相同文件名的存储库吗? 网络上有没有一个示例如何使用JGit进行提交?
我正在尝试使用jgit将单个blob直接提交到存储库中。我知道如何插入blob并获得它的sha1,但是我很难为这个场景构建一个树。我似乎不知道如何正确地使用jgit的树抽象(TreeWalk之类的)来递归地构造一个树,几乎与以前的提交相同,只是blob的父树不同。 在JGit中执行此操作的惯用方法是什么? 我之所以这么问,是因为我正在编写一个程序,它类似于git存储库中文档的编辑器。在我的例子中,
我需要使用JGit获取与特定提交关联的分支的名称。我使用JGit获取存储库的提交SHA的完整列表,现在我需要知道它所属的分支的名称。 如果有人能让我知道我如何做到这一点,我将不胜感激。