2017-01-31 141 views
0

我即将开发一个工具,它读出一个属性文件,然后创建一个文件夹并从这些URL中抽取仓库。使用JGit创建一个克隆仓库属性的工具

其实我设法让它创建一个文件夹/子文件夹,复制一个项目到它:

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

当我今天来看,我收到以下错误消息的第二次:

Exception in thread "main" org.eclipse.jgit.api.errors.JGitInternalException: Destination path "repo1" already exists and is not an empty directory 

我不明白为什么JGit试图覆盖现有的目录。我知道在那里重新注册是没有意义的 - 但令我困扰的是JGit不会“移动”到这个文件夹并执行命令。我即将在现有的存储库中执行FetchCommand。在目前的状态下,我认为JGit会一直告诉我这个目录已经存在。

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

回答

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/

+0

我用这种方法来实际创建一个“非裸”存储库的问题。 'Git.init()。setDirectory(dirPath).call()'给了我一个“非裸”,但我还没有找到一种方法来检查是否已经创建了存储库。 – xetra11

+0

根据_folder_表示什么,您可能需要使用'BaseRepositoryBuilder :: setWorkTree()'而不是':: setGirDir()'回答中提到的文章讨论了git dir与工作目录以及如何检测存储库被创造了长度。 –

0

测试,如果回购(目录)已经存在,妥善处理这个问题:

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. 
} 
+3

虽然你可能已经解决了这个用户的问题,唯一的代码,答案是没有谁前来的未来这个问题的用户非常有帮助。请编辑您的答案,以解释为什么您的代码可以解决原始问题。 –