我使用JGit实现一个非常简单的Git客户端,它只能做两件事:
客户端不必担心冲突,因为假设文件永远不会被修改,只会被添加或删除。
我的代码如下。 我的问题是,getFile()中的fetch不会从存储库中获取任何更新。如果我用pull取代fetch,我得到一个
org.eclipse.jgit.api.errors.InvalidConfigurationException:没有值 for configuration branch.development.merge在配置
中找到
我不确定配置应该是什么样子,但是在执行main()后它看起来如下所示,我会假设分支“开发”缺少一个条目?
有人可以帮忙吗?
更新了代码和配置,问题仍然存在
public class GitClient {
private String remoteRepositoryUI;
private String localRepositoryPath;
private Git localGit;
private UsernamePasswordCredentialsProvider credentialsProvider;
public GitClient(String remoteRepositoryURI, String localRepositoryPath,
String user, String password) {
this.credentialsProvider = new UsernamePasswordCredentialsProvider(user, password);
this.remoteRepositoryUI = remoteRepositoryURI;
this.localRepositoryPath = localRepositoryPath;
}
public void addFile(String sourceFilePath, String repositoryFilePath, Branch branch, String message) throws Exception {
switchBranch(branch);
FileUtils.copyFile(new File(sourceFilePath),
new File(this.localRepositoryPath + File.separator + repositoryFilePath));
localGit.add().addFilepattern(repositoryFilePath).call();
localGit.commit().setMessage(message).call();
localGit.push().setCredentialsProvider(this.credentialsProvider).call();
}
public File getFile(String repositoryFilePath, Branch branch) throws Exception {
switchBranch(branch);
return new File(this.localRepositoryPath + File.separator + repositoryFilePath);
}
private void switchBranch(Branch branch) throws InvalidRemoteException, TransportException, IOException, GitAPIException {
if(!isInitialized())
initialize(branch);
boolean branchExists = localGit.getRepository().getRef(branch.toString()) != null;
if (!branchExists) {
localGit.branchCreate()
.setName(branch.toString())
.setUpstreamMode(SetupUpstreamMode.TRACK)
.setStartPoint("origin/" + branch.toString())
.call();
}
localGit.checkout().setName(branch.toString()).call();
localGit.fetch().call();
localGit.pull();
}
private boolean isInitialized() {
return this.localGit != null;
}
private void initialize(Branch branch) throws IOException,
InvalidRemoteException, TransportException, GitAPIException {
boolean localRepositoryExists = true;
try {
this.localGit = Git.open(new File(this.localRepositoryPath));
} catch(IOException e) {
localRepositoryExists = false;
}
if(!localRepositoryExists) {
List<String> branchesToClone = new LinkedList<String>();
for(Branch aBranch : Branch.values())
branchesToClone.add(aBranch.toString());
Git.cloneRepository()
// set the branches to clone from remote to local repository
.setBranchesToClone(branchesToClone)
// set the initial branch to check out and where to place HEAD
.setBranch("refs/heads/" + branch.toString())
// provide the URI of the remote repository from where to clone
.setURI(this.remoteRepositoryUI)
// set local store location of the cloned repository
.setDirectory(new File(this.localRepositoryPath))
.call();
this.localGit = Git.open(new File(this.localRepositoryPath));
for(Branch aBranch : Branch.values()) {
boolean branchExists = localGit.getRepository().getRef(aBranch.toString()) != null;
if (!branchExists) {
localGit.branchCreate()
.setName(aBranch.toString())
.setUpstreamMode(SetupUpstreamMode.TRACK)
.setStartPoint("origin/" + aBranch.toString())
.call();
}
localGit.checkout().setName(aBranch.toString()).call();
}
}
}
public static void main(String[] args) throws Exception {
GitClient clientA = new GitClient("URLToRepository.git",
"local", "username", "password");
GitClient clientB = new GitClient("URLToRepository.git",
"localB", "username", "password");
clientA.addFile("fileA1", "fileA1", Branch.master, "clientA1");
clientB.addFile("fileB1", "fileB1", Branch.master, "clientB1");
clientB.addFile("fileB2", "fileB2", Branch.development, "clientB2");
clientA.addFile("fileA2", "fileA2", Branch.development, "clientA2");
clientA.addFile("fileA3", "fileA3", Branch.master, "clientA3");
File file = clientA.getFile("fileA1", Branch.master);
System.out.println(file.getAbsolutePath() + " " + file.exists());
file = clientA.getFile("fileA2", Branch.development);
System.out.println(file.getAbsolutePath() + " " + file.exists());
file = clientA.getFile("fileA3", Branch.master);
System.out.println(file.getAbsolutePath() + " " + file.exists());
file = clientA.getFile("fileB1", Branch.master);
System.out.println(file.getAbsolutePath() + " " + file.exists());
file = clientA.getFile("fileB2", Branch.development);
System.out.println(file.getAbsolutePath() + " " + file.exists());
}
}
配置:
[core]
repositoryformatversion = 0
filemode = false
logallrefupdates = true
[remote "origin"]
url = URLToRepository.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "development"]
remote = origin
merge = refs/heads/development
答案 0 :(得分:3)
在switchBranch
中,将以下选项添加到CheckoutCommand
:
setCreateBranch(true)
问题是,这应该只进行一次(如果分支已经存在,它将失败)。因此,不要在一个命令中执行,而是单独创建分支和结帐:
String branchName = branch.toString();
boolean branchExists = localGit.getRepository().getRef(branchName) != null;
if (!branchExists) {
localGit.branchCreate()
.setName(branchName)
.setUpstreamMode(SetupUpstreamMode.TRACK)
.setStartPoint("origin/" + branchName)
.call();
}
localGit.checkout().setName(branchName).call();