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



i具有不完全支持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中只有第一个REF才能更新

我的意图在此处很清楚,更新2个带有一个值的参考(远程/原点/branchname和head/branchName(,带有一个值(遥控器/原始/branchname(。 我已经检查了JGIT代码,并且发现有某种检查基于源参考的参考(这就是为什么要处理第一个参数而第二个参数的原因(。

如何使用fetch命令正确执行?我是否真的必须使用setForce(true)进行branchChreate才能更新头/分支名称?

拥有多个目标RefSpec是有说服力的,但这不存在。

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();

请注意,hoever,在两种情况下,您都将失去本地分支的所有更改。

最新更新