我有一个不完全支持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
中的第一裁判才被更新
我的意图很明确,用一个值(remotes / origin / branchName)用值更新2个引用(remotes / origin / branchName和heads / branchName)。 我已经检查了JGit代码,发现有一些检查可以跳过基于源ref的引用(这就是为什么第一个参数被处理而第二个参数没有被处理的原因)。
如何使用fetch
命令正确执行此操作?我真的需要对branchChreate
做setForce(true)
来更新heads / branchName吗?
最好有多个目的地RefSpec
,但这并不存在。
答案 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();
不过,请注意,在两种情况下,您都会丢失本地分支中的所有更改。