使用JGit创建一个从属性中克隆存储库的工具

时间:2017-01-31 17:04:40

标签: java git jgit

我即将开发一个工具,用于读取属性文件,然后从中创建文件夹,并从这些URL中提取存储库。

实际上我设法让它创建一个文件夹/子文件夹并将一个项目克隆到其中:

DO
$$
DECLARE rid BIGINT;
BEGIN
    ALTER TABLE voters ALTER COLUMN id DROP NOT NULL;

    FOR rid IN 
        SELECT id from decision_realms WHERE id NOT IN (SELECT realm_id FROM voters WHERE realm_id IS NOT NULL) 
    LOOP
        INSERT INTO voters (voter_user_id, max_weight, actual_weight)
        SELECT contributor_user_id, pps, pps 
        FROM contributors WHERE 
        project_id= (SELECT project_id FROM goals WHERE id=(SELECT goal_id FROM decision_realms WHERE id=rid));
    END LOOP;

END
$$

第二次运行时,我收到以下错误消息:

File repoOne = new File("repositories/repo1");
Git git = Git.cloneRepository()
        .setURI("https://github.com/xetra11/renderay.git")
        .setDirectory(repoOne)
        .call();

我真的不明白JGit为什么试图覆盖现有目录。我知道那里的重新克隆是毫无意义的 - 但令我困扰的是,JGit不会只是“移动”到这个文件夹并执行命令。我即将在现有的存储库中执行Exception in thread "main" org.eclipse.jgit.api.errors.JGitInternalException: Destination path "repo1" already exists and is not an empty directory 。在当前状态下,我假设JGit将始终告诉我该目录已经存在。

任何想法如何让他只是在文件夹中执行命令?如果它存在?

2 个答案:

答案 0 :(得分:1)

要将文件夹用作克隆的本地目标,它必须不存在或为空。

您可能想要检测某个存储库是否存在于给定文件夹中,然后仅获取新更改并以其他方式进行克隆。

为了确定存储库是否存在,请使用以下代码:

FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
repositoryBuilder.setGitDir( folder );
Repository repository = repositoryBuilder.build();
boolean repositoryExists = repository.getRef( "HEAD" ) != null );

现在您可以克隆或获取,具体取决于存储库是否存在。

有关使用JGit访问存储库的更详细讨论,请参阅此处:http://www.codeaffine.com/2014/09/22/access-git-repository-with-jgit/

答案 1 :(得分:0)

测试repo(目录)是否已存在并正确处理:

File repoOne = new File("repositories/repo1");
if (repoOne.exists()) {
  // Check if it's a repo or do something else.
} else {
  // Repository doesn't exist, create it.
}