i具有不完全支持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
中只有第一个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,在两种情况下,您都将失去本地分支的所有更改。