我是git的新用户,正在使用JGit与远程git存储库进行交互。在JGit中,我使用CloneCommand
来最初克隆一个repo,它没有问题。但是,当我尝试使用PullCommand
(相当于SVN更新AFAIK)时,本地存储库内容不会更新。
这是我使用的代码:
private String localPath;
private Repository localRepo;
private Git git;
localPath = "/home/test/git_repo_test";
remotePath = "https://github.com/test/repo_1.git";
try {
localRepo = new FileRepository(localPath + "/.git");
} catch (IOException e) {
e.printStackTrace();
}
git = new Git(localRepo);
PullCommand pullCmd = git.pull();
try {
pullCmd.call();
} catch (GitAPIException e) {
e.printStackTrace();
}
这不会更新我使用命令行推送到远程存储库的新文件的本地存储库。但是,如果我删除本地存储库并再次获取克隆,则会反映所有更改。
请告诉我在JGit中使用PullCommand
的正确方法。
编辑:
远程存储库的结构:
root ____ file_1
|______ directory_1
|__________ file_2
|__________ file_3
directory_1并且在初始克隆之后从命令行推送了两个文件,并且我尝试了这个代码,以便它将反映在本地存储库中,这不会发生。
用于克隆存储库的代码:
File file = new File(localPath);
CloneCommand cloneCmd = git.cloneRepository();
try {
cloneCmd.setURI(remotePath)
.setDirectory(file)
.call();
} catch (GitAPIException e) {
e.printStackTrace();
}
此处,git
,localPath
和remotePath
与上述变量相同。
答案 0 :(得分:7)
我怀疑问题是当前分支没有上游配置(因此pull不会合并获取的分支)。
要查看拉动期间发生的情况,请检查pullCmd.call()
:
PullResult result = pullCmd.call();
FetchResult fetchResult = result.getFetchResult();
MergeResult mergeResult = result.getMergeResult();
mergeResult.getMergeStatus(); // this should be interesting
答案 1 :(得分:4)
Documentations说明了以下Git
类的构造函数:
构造一个可以与指定的git存储库交互的新Git对象。此类的方法返回的所有命令类将始终与此git存储库进行交互。
所以,正如我所建议的那样,你必须将远程仓库的路径传递给构造函数,现在你正试图从你的本地仓库中提取。
答案 2 :(得分:0)
我遇到了同样的问题。对我来说,解决方案是在克隆后设置git配置文件:
CloneCommand cloneCommand = Git.cloneRepository();
cloneCommand.setURI("<repo-uri>");
cloneCommand.setDirectory("<repo-dir>");
cloneCommand.call();
Git git = Git.open("<repo-dir>");
StoredConfig config = git.getRepository().getConfig();
config.setString("branch", "master", "merge", "refs/heads/master");
config.setString("branch", "master", "remote", "origin");
config.setString("remote", "origin", "fetch", "+refs/heads/*:refs/remotes/origin/*");
config.setString("remote", "origin", "url", "<repo-uri>");
config.save();
拉动时,我将远程分支名称设置为“ master”,将远程分支名称设置为“ origin”:
PullCommand pull = git.pull();
pull.setRemote("origin");
pull.setRemoteBranchName("master");
在拉动后有了这些更改,我看到了更改在本地反映出来。
答案 3 :(得分:0)
尝试使用此代码从私有存储库中提取 git pull
try {
Repository localRepo = new FileRepository(localPath + "/.git");
Git git = new Git(localRepo);
CredentialsProvider cp = new UsernamePasswordCredentialsProvider(userName, pass);
git.pull().setCredentialsProvider(cp).call();
git.close();
} catch (Exception e) {
}