首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JGIT强制更新给定的remotes分支和头元数据?

如何使用JGIT强制更新给定的remotes分支和头元数据?
EN

Stack Overflow用户
提问于 2019-07-05 07:37:52
回答 1查看 221关注 0票数 0

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

  1. 提交总是立即被推送。
  2. 在进行任何交互以更新本地存储库状态之前,都会执行提取操作。

这就是我如何根据请求获取给定的分支。

代码语言:javascript
复制
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 中,只首先更新了。

在这里,我的意图很明确,用值更新2个引用(远程/原产地/分支名称和标题/分支名称),其中一个值(远程/原产地/分支名称)。我已经检查了JGit代码,并发现有某种类型的检查可以跳过基于源引用的引用(这就是为什么处理第一个参数而不是处理第二个参数)。

如何使用fetch命令正确地执行此操作?我真的需要用branchChreatesetForce(true)来更新头/分支名吗?

有多个目的地RefSpec是很方便的,但这并不存在。

EN

回答 1

Stack Overflow用户

发布于 2019-07-05 10:33:32

FetchCommand永远不会更改任何本地分支(如refs/heads/foo)。它只更新远程跟踪分支,如refs/remotes/origin/foo)。

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

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

假设HEAD指向refs/heads/foo,即foo已签出,则可以使用此代码将分支重置为其远程标记分支:

代码语言:javascript
复制
git.reset().setRef("refs/remotes/origin/foo").setMode(ResetType.HARD).call();

如果没有签出应该重置的分支,您可以简单地使用以下RefUpdate

代码语言:javascript
复制
ObjectId remoteCommitId = repository.resolve("refs/remotes/origin/foo");
repository.updateRef("refs/heads/foo").setNewObjectId(remoteCommitId).forceUpdate();

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56898597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档