如何使用JGIT强制更新给定的遥控器和头部元数据分支?

时间:2019-07-05 07:37:52

标签: git jgit

我有一个不完全支持git的应用程序。要求远程存储库始终是事实的唯一来源,所以

  1. 提交总是立即被推送
  2. 在进行任何交互以更新本地存储库状态之前完成获取

这是我应要求获取给定分支的方式

private void fetchBranch(String branch) throws GitAPIException {
        RefSpec ref = new RefSpec().setSourceDestination(Constants.R_HEADS + branch, Constants.R_REMOTES + Constants.DEFAULT_REMOTE_NAME + "/" + branch)
                .setForceUpdate(true);
        RefSpec ref2 = new RefSpec().setSourceDestination(Constants.R_HEADS + branch, Constants.R_HEADS + branch)
                .setForceUpdate(true);
        git.fetch()
                .setRemote(Constants.DEFAULT_REMOTE_NAME)
                .setRefSpecs(ref2,ref)
                .setCredentialsProvider(credentials.orElse(null))
                .setProgressMonitor(new FetchProgressMonitor(log, configuration))
                .setForceUpdate(true)
                .call();

//        git.branchCreate()
//                .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM)
//                .setName(branch)
//                .setStartPoint(Constants.DEFAULT_REMOTE_NAME + "/" + branch)
//                .setForce(true)
//                .call();
}

我在这里的意图显然是将(本地)远程头和本地头更新为远程存储库上的状态。

但是,只有setRefSpecs中的第一裁判才被更新

我的意图很明确,用一个值(remotes / origin / branchName)用值更新2个引用(remotes / origin / branchName和heads / branchName)。  我已经检查了JGit代码,发现有一些检查可以跳过基于源ref的引用(这就是为什么第一个参数被处理而第二个参数没有被处理的原因)。

如何使用fetch命令正确执行此操作?我真的需要对branchChreatesetForce(true)来更新heads / branchName吗?

最好有多个目的地RefSpec,但这并不存在。

1 个答案:

答案 0 :(得分:0)

FetchCommand将永远不会更改您的任何本地分支机构(例如refs/heads/foo)。它只会更新refs/remotes/origin/foo之类的远程跟踪分支。

通常的过程是获取对远程跟踪分支的更改,然后合并或重新设置基础或重置本地分支和远程跟踪分支。

如果您想用获取的任何内容覆盖本地更改,则应使用ResetCommand将本地分支硬重置为远程跟踪分支。

假设HEAD指向refs/heads/foo,即foo被签出,您可以使用以下代码将分支重置为其远程跟踪分支:

git.reset().setRef("refs/remotes/origin/foo").setMode(ResetType.HARD).call();

如果未检出应重置的分支,则可以像这样简单地使用RefUpdate

ObjectId remoteCommitId = repository.resolve("refs/remotes/origin/foo");
repository.updateRef("refs/heads/foo").setNewObjectId(remoteCommitId).forceUpdate();

不过,请注意,在两种情况下,您都会丢失本地分支中的所有更改。