我一直在使用Subclipse API为Eclipse创建一个插件,用于侦听通过Subclipse插件发生的Subversion事件.我基本上实现了一个侦听器接口,然后在运行时通知有关正在进行的事件.
我想做类似的事情,但对于Git.在使用其他插件时,似乎EGit(基于JGit构建)将是最佳选择.我对他们的API没有多少经验.我想知道是否有人知道EGit或底层JGit是否有类似的API接口用于监听Git事件(例如提交,推送,拉取等)?
谢谢!
我调用了jgit log命令并找回了一些RevCommit对象.我可以从中获取一些基本信息,并使用以下代码获取更改的文件列表.我还需要做两件事:
1)如果提交没有父母,我如何获得以下信息?
2)如何获取每个文件中更改的内容的差异
RevCommit commit = null;
RevWalk rw = new RevWalk(repository);
RevCommit parent = null;
if (commit.getParent(0) != null) {
parent = rw.parseCommit(commit.getParent(0).getId());
}
DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
df.setRepository(repository);
df.setDiffComparator(RawTextComparator.DEFAULT);
df.setDetectRenames(true);
List<DiffEntry> diffs = df.scan(parent.getTree(), commit.getTree());
for (DiffEntry diff : diffs) {
System.out.println(getCommitMessage());
System.out.println("changeType=" + diff.getChangeType().name()
+ " newMode=" + diff.getNewMode().getBits()
+ " newPath=" + diff.getNewPath()
+ " id=" + getHash());
}
Run Code Online (Sandbox Code Playgroud) 当我将JGit用于diff两个文件时,必须首先创建一个存储库。但是在Git中,我只需要使用command git diff --no-index 1.txt 2.txt。
有没有一种方法可以diff在JGit中使用而无需创建仓库?
我能够在JGit中使用clone命令克隆repo
Repo是http,当然,当我落后于代理时,它无法克隆
您能帮我解决一下代码示例如何在java中使用代理配置JGit
谢谢!
我已经回顾了几个关于压缩最新提交和压缩根提交的相关问题,但这两个问题都不能帮助我压缩不是根本的非最近提交.
这是我的开始场景:
D---E---F---G---H---I---J master
Run Code Online (Sandbox Code Playgroud)
和我想要的结果:
D---E---Z---I---J master
Run Code Online (Sandbox Code Playgroud)
什么Z是壁球F---G---H,和F---G---H,D---E和,I---J可以是任意长的非分支提交序列.
第一种方法:
[lucas]/home/blah/$ git rebase -i D
rebase in progress; onto D
You are currently editing a commit while rebasing branch 'master' on 'D'.
No changes
You asked to amend the most recent commit, but doing so would make
it empty. You can repeat your command with --allow-empty, or you can
remove the commit entirely with "git reset HEAD^". …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建IAM权限,因此jgit可以访问我的一个存储桶中的目录.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::<mybucket>/<mydir>/*"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::<mybucket>/<mydir>"]
}
]
}
Run Code Online (Sandbox Code Playgroud)
不幸的是它会抛出一个错误.我不确定还有什么其他允许行动才能实现.(在IAM有点新).
Caused by: java.io.IOException: Reading of '<mydir>/packed-refs' failed: 403 Forbidden
at org.eclipse.jgit.transport.AmazonS3.error(AmazonS3.java:519)
at org.eclipse.jgit.transport.AmazonS3.get(AmazonS3.java:289)
at org.eclipse.jgit.transport.TransportAmazonS3$DatabaseS3.open(TransportAmazonS3.java:284)
at org.eclipse.jgit.transport.WalkRemoteObjectDatabase.openReader(WalkRemoteObjectDatabase.java:365)
at org.eclipse.jgit.transport.WalkRemoteObjectDatabase.readPackedRefs(WalkRemoteObjectDatabase.java:423)
... 13 more
Caused by: java.io.IOException:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>...</RequestId><HostId>...</HostId></Error>
at org.eclipse.jgit.transport.AmazonS3.error(AmazonS3.java:538)
... 17 more
Run Code Online (Sandbox Code Playgroud)
403 Forbidden显然是错误但不确定需要添加到IAM中的内容.有任何想法吗?
[本来应该补充说,我在政策模拟器中尝试了这个,它似乎在那里工作.]
当我们这样做时,git log --shortstat我们得到插入,删除和更改的行数.就像是:
1 file changed, 9 insertions(+), 3 deletions(-)
Run Code Online (Sandbox Code Playgroud)
请帮助我获取插入,删除和更改的行数.
我正在做一个存储库克隆来获取本地机器上的git项目.这是相同的代码:
RepoClone repoClone=new RepoClone();
repoClone.repoCloner();
repository = builder.setGitDir(repoClone.repoDir).setMustExist(true).build();
Run Code Online (Sandbox Code Playgroud)我甚至能得到一个TreeWalk:
TreeWalk treeWalk=getCommitsTreeWalk();
Run Code Online (Sandbox Code Playgroud)我能够检索文件名,每个文件的提交次数,LOC以及处理每个xml/java文件的开发人员数量.
while (treeWalk.next()) {
if (treeWalk.getPathString().endsWith(".xml") || treeWalk.getPathString().endsWith(".java")) {
jsonDataset = new JSONObject();
countDevelopers = new HashSet < String > ();
count = 0;
logs = new Git(repository).log().addPath(treeWalk.getPathString()).call();
for (RevCommit rev: logs) {
countDevelopers.add(rev.getAuthorIdent().getEmailAddress());
count++;
}
jsonDataset.put("FileName", treeWalk.getPathString());
jsonDataset.put("CountDevelopers", countDevelopers.size());
jsonDataset.put("CountCommits", count);
jsonDataset.put("LOC", countLines(treeWalk.getPathString()));
commitDetails.put(jsonDataset);
}
}
Run Code Online (Sandbox Code Playgroud)现在,我想检索每个文件插入和删除的行数.
请帮忙.提前感谢.
我需要InMemoryRepository使用JGit 将现有的git存储库克隆到,更改文件的内容并将更改推回远程存储库。
我找不到将存储库克隆到内存中存储库的任何示例。
我尝试了这个:
InMemoryRepository.Builder builder = new InMemoryRepository.Builder();
InMemoryRepository inm = builder.build();
Git.cloneRepository().setURI("git@[github_url].git").setDirectory(inm.getDirectory()).call();
Run Code Online (Sandbox Code Playgroud)
导致错误:
“目标路径“ .git”已存在,并且不是空目录”。
我检查了InMemoryRepository.Builder和Repository类的配置选项,但没有发现任何有用的东西。
怎么做到呢?然后,从内存中存储库更改文件的内容并将其推送到github是否存在任何问题?
使用JGit时,请执行同一服务器上的远程推送.
1)如果遥控器配置为file://或/path/to/git/remote,则不会执行预接收挂钩.
2)如果配置了遥控器ssh://,将执行预接收挂钩.
如果使用Git命令行执行相同的推送,将始终执行预接收挂钩.
我不明白为什么会这样.
当我运行以下示例代码时:
public static void main(String[] args) throws IOException, GitAPIException {
Git git = new Git(new FileRepository(PATH_TO_REPO);
BlameCommand blameCommand = git.blame();
blameCommand.setStartCommit(git.getRepository().resolve("HEAD"));
blameCommand.setFilePath(PATH_TO_FILE);
BlameResult blameResult = blameCommand.call();
Set<Integer> iterations = new HashSet<>();
Set<Integer> gitSourceLines = new HashSet<>();
RawText rawText = blameResult.getResultContents();
for (int i = 0; i < rawText.size(); i++) {
iterations.add(i);
gitSourceLines.add(blameResult.getSourceLine(i));
System.out.println("i = " + i +
", getSourceLine(i) = " + blameResult.getSourceLine(i));
}
System.out.println("iterations size: " + iterations.size());
System.out.println("sourceLines size: " + gitSourceLines.size());
}
Run Code Online (Sandbox Code Playgroud)
该文件的结果如下:
i = …Run Code Online (Sandbox Code Playgroud)