是否可以使用 diff/git (或其他常见实用程序)生成 仅包含与模式匹配的更改的差异?
例如,我有一个文件有两个不同的版本:
a/文件.txt
alpha
marker 100
omega
Run Code Online (Sandbox Code Playgroud)
b/文件.txt
start
marker 200
end
Run Code Online (Sandbox Code Playgroud)
我想生成仅包含对包含字符串marker(或其他正则表达式模式)的行的更改的补丁:
diff --git a/file.txt b/file.txt
index eb27e64..fcc1676 100644
--- a/file.txt
+++ b/file.txt
@@ -1,3 +1,3 @@
alpha
-marker 100
+marker 200
omega
Run Code Online (Sandbox Code Playgroud)
(应用此类补丁后,只有 alpha->start、omega->end 更改仍处于待处理状态。)
现在我有一个带有 JGit 的自定义基于行的处理器,但是我对我的实现非常不满意,因为我必须手动解析/拆分/重新组合块,并通过复制/破解 JGit 内部来生成差异)。
由于这似乎是一个常见的用例,我希望有一些工具可以提供开箱即用的功能,但到目前为止我还没有找到任何东西。
请注意,使用类似git diff -G'marker'或任何类型的块过滤是不够的,因为块本身可以任意大(例如,这里只有一个块包含整个文件更改)。
我想获得一个存储库的所有标签列表以及tagger和带有JGit的commit-IDs.
首先,我尝试了Git.tagList().call()命令并解析标签:
objectIdOfTag = oneResultOfTheTagList.getObjectId();
// or should I call getPeeledObjectId() here?
RevWalk walk = new RevWalk(repository);
RevTag tag = walk.parseTag(objectIdOfTag);
Run Code Online (Sandbox Code Playgroud)
这适用于我的存储库,但我不确定这是否正确:呼叫是正确Ref.getObjectId()还是应该呼叫Ref.getPeeledObjectId()?(什么是" 去皮的 ObjectId"?)
使用JGit检索标记列表时,轻量级和带注释的标记之间是否存在差异?
自Jenkins git-client插件开始使用jgit以来,配置问题已经出现很多问题,我所看到的所有解决方案都只是转而使用旧的git命令行,因为现在大多数安装都有大量的hack来制作它大部分时间都有效.
我们在同一条船上,但是在Windows下git命令行仍然非常不可靠.我们喜欢jgit在新版本中使用引擎的想法git-client,并希望看看它是否真的让事情变得更好.但我找不到一个关于如何迁移的文件jgit.
仅供参考我已经知道了
-Dorg.jenkinsci.plugins.gitclient.Git.useCLI=false
,
-Dorg.jenkinsci.plugins.gitclient.Git.useJGit=true
我正在寻找的是如何为ssh,电子邮件/用户信息等配置jgit.
我已经研究过从Java控制Git的可能性.我发现的是:
Runtime.getRuntime().exec("git command")- 让Java用git执行命令我尝试使用Runtime和ProcessBuilder为git编写自己的Java包装器,但是我遇到了进程线程的问题,等待线程完成一些时间.
然后,我研究了其他API解决方案.首先我尝试了JavaGit API,但我根本无法工作.
其次,我测试了JGit API,看起来很棒.但我很快就发现我无法像使用Java包装器那样设置提交日期:
ProcessBuilder pb = new ProcessBuilder("git", "commit", "--date=" + "\"" + customDateString + "\"", "-m \"" + comment + "\"");
Run Code Online (Sandbox Code Playgroud)
我下载了JGit源代码,看看我是否可以实现它,但它读得太多了,我无法在Github上找到任何问题跟踪器,以便JGit提出建议.
有人可以帮我这样做吗?
或者告诉我在哪里可以写信给开发人员提出建议?
关于如何使用任何建议RebaseCommand,MergeCommand或JGit到壁球提交任何其他命令?我找不到很多例子,文档也没什么帮助.
一个简单的例子
我想压制下面的树:
A-----B------C------D------E------F------G------H
Run Code Online (Sandbox Code Playgroud)
进入这一个:
A----Z-----H
Run Code Online (Sandbox Code Playgroud)
凡Z被压扁提交的B,C,D,E,F,和G.
任何建议和有用的资源表示赞赏.
我正在尝试使用JGit来获取上次提交的文件与最近未提交的更改之间的差异.我怎么能用JGit做到这一点?(使用命令行将输出git diff HEAD)
经过几次讨论(link1,link2)后,我带来了一段代码,能够找到未提交的文件,但是我无法区分文件
Repository db = new FileRepository("/path/to/git");
Git git = new Git(db);
AbstractTreeIterator oldTreeParser = this.prepareTreeParser(db, Constants.HEAD);
List<DiffEntry> diff = git.diff().setOldTree(oldTreeParser).call();
for (DiffEntry entry : diff) {
System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
DiffFormatter formatter = new DiffFormatter(System.out);
formatter.setRepository(db);
formatter.format(entry);
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
这个问题很久以前了.我现有的用于显示未提交的代码.prepareTreeParser在显示差异的上下文中,我正在使用的当前代码是:
public void gitDiff() throws Exception {
Repository db = new FileRepository("/path/to/git" + DEFAULT_GIT);
Git git = new …Run Code Online (Sandbox Code Playgroud) 想出了:
/**
* Create a repo at the specified directory or open one if it already
* exists. Return a {@link Git} object...
*
* @param p
* Path to the repo root (the dir that contains the .git folder)
* @return a "Git" object to run porcelain commands on...
* @throws GitterException
* if the specified path cannot be resolved to a directory, or
* the repository failed to be build (...) or created
*/
public static Git open(Path …Run Code Online (Sandbox Code Playgroud) 我正在使用JGit开发一个项目.我设法删除了一个分支,但我也想检查该分支是否已检出.我发现了一个变量,CheckoutCommand但它是私有的:
private boolean isCheckoutIndex() {
return startCommit == null && startPoint == null;
}
Run Code Online (Sandbox Code Playgroud)
没有公共方法返回我想要的东西.当我在签出的分支上使用下面的命令时,它返回一个错误,分支无法删除,所以我想先检查是否签出.
git.branchDelete().setForce(true).setBranchNames(branchName).call();
Run Code Online (Sandbox Code Playgroud) 我需要在java中克隆一个git repo.我正在使用jGit.
我正在使用的代码行是:
Git clone = Git.cloneRepository().setURI(URIofRepo).setDirectory(localPath).call();
Run Code Online (Sandbox Code Playgroud)
其中URIofRepo是:我的repo的github链接和localPath的位置:我希望克隆发生的目录.
这非常有效.但是,由于我正在使用的项目不需要克隆来继续工作,我只是希望克隆具有github repo的内容而没有.git目录.
我也试过使用以下内容:
File dirToDelete = new File (path + "/.git");
FileUtils.deleteDirectory(dirToDelete);
Run Code Online (Sandbox Code Playgroud)
但是我得到一个IO异常,说我无法删除该文件,如下所示:
线程"main"中的异常java.io.IOException:无法删除文件:C:\ testing\testRepo1.git\objects\pack\pack-7ca7f11688adda065d62f3394d0e055346beff22.pack
我正在研究一个ANT任务,该任务调用一些使用JGit在git存储库上创建新分支并将其推送到远程的java.我正在使用JGit 2.1.0.
这是代码:
CreateBranchCommand bcc;
CheckoutCommand checkout;
Git git;
try {
Repository repo = new FileRepositoryBuilder().readEnvironment().findGitDir(src).build();
git = new Git(repo);
bcc = git.branchCreate();
checkout = git.checkout();
} catch (IOException e) {
throw new BuildException("Could not access repository " + src, e);
}
try {
bcc.setName(branch)
.setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM)
.setStartPoint("origin/" + branch)
.setForce(force)
.call();
checkout.setName(branch);
checkout.call();
}
} catch (Exception e) {
throw new BuildException("Could not checkout repository " + src, e);
}
Run Code Online (Sandbox Code Playgroud)
该SRC变量被设置为git仓库的路径(其已经被克隆).该分支变量设置为:release_2_0_2 的力变量设置为:真 …