我有一个不完全支持git的应用程序。其要求是远程存储库始终是唯一的真相来源,所以
这就是我如何根据请求获取给定的分支。
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命令正确地执行此操作?我真的需要用branchChreate和setForce(true)来更新头/分支名吗?
有多个目的地RefSpec是很方便的,但这并不存在。
发布于 2019-07-05 10:33:32
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,在这两种情况下,您都将丢失本地分支中的所有更改。
https://stackoverflow.com/questions/56898597
复制相似问题