Usage of 'pull' command in Jgit

六眼飞鱼酱① 提交于 2019-12-10 12:59:00

问题


I'm a new user of git and am using JGit to interact with a remote git repository. In JGit, I used CloneCommand to initially to clone a repo, and it worked without a issue. However, when I try to use PullCommand, which is the equivalent of SVN update AFAIK, the local repo contents are not updated.

This is the code that I used:

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();  
}

This doesn't update the local repository for new files which I have pushed to the remote repository using the command line. However, if I delete the local repository and take a clone again, all the changes are reflected.

Please let me know what is the correct approach of using PullCommand in JGit.

EDIT:

The structure of the remote repository:

root ____ file_1
  |______ directory_1
              |__________ file_2 
              |__________ file_3

directory_1 and the two files are pushed from the commandline after the initial cloning and I tried this code so that it will get reflected in the local repository, which is not happening.

The code used to clone the repository:

File file = new File(localPath);
CloneCommand cloneCmd = git.cloneRepository();
try {
    cloneCmd.setURI(remotePath)
            .setDirectory(file)
            .call();
} catch (GitAPIException e) {
    e.printStackTrace();  
}

Here, git, localPath and remotePath are the same variable as above.


回答1:


I suspect the problem is that the current branch has no upstream configuration (and so pull won't merge the fetched branch).

To see what happened during the pull, inspect the result of pullCmd.call():

PullResult result = pullCmd.call();
FetchResult fetchResult = result.getFetchResult();
MergeResult mergeResult = result.getMergeResult();
mergeResult.getMergeStatus();  // this should be interesting



回答2:


Documentations says about constructor of Git class following:

Constructs a new Git object which can interact with the specified git repository. All command classes returned by methods of this class will always interact with this git repository.

So, as I can suggest, you have to pass path of remote repo to constructor, now you're trying to pull from your local repo.




回答3:


I ran into the same issue. For me the solution was to set the git config file after cloning:

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();

When pulling I set the remote branch name to "master" and the remote to "origin":

PullCommand pull = git.pull();
pull.setRemote("origin");
pull.setRemoteBranchName("master");

With these changes after pulling I see the changes reflected locally.



来源:https://stackoverflow.com/questions/13399990/usage-of-pull-command-in-jgit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!