如何使用jgit将现有存储库克隆到新的github实例?

时间:2015-02-07 09:55:00

标签: java git github jgit

我们有两个单独的GitHub实例在运行。一个GitHub实例是https://github.dev.host.com,其他github实例是https://github.host.com。我在https://github.dev.host.com中有各种存储库,我需要迁移到这个新的github实例https://github.host.com

我正在使用JGit,因为我正在使用Java。例如 - 以下是https://github.dev.host.com实例中存在的存储库,我需要将其迁移到新的github实例https://github.host.com

https://github.dev.host.com/Database/ClientService
https://github.dev.host.com/Database/Interest

当我使用JGit时,我想通过Java代码在我的新GitHub实例中创建这两个上面的存储库。在运行我的Java代码之后,我应该看到所有上述存储库及其https://github.dev.host.com中的所有分支和内容到我的新Github实例https://github.host.com中,如下所示:

https://github.host.com/Database/ClientService
https://github.host.com/Database/Interest

我只需要迭代我在旧github实例中的所有存储库列表,如果他们不在我的新github实例中退出其所有内容和分支,则创建它们。如果它们已经存在,则覆盖从旧实例到新实例的所有更改。

使用JGit可以做到这一点吗?我还通过用户名和密码https访问了我的两个github实例。

截至目前,我只能做以下所示的基本内容,这是我通过本教程学到的。

public class CreateNewRepository {

    public static void main(String[] args) throws IOException {
        // prepare a new folder
        File localPath = File.createTempFile("TestGitRepository", "");
        localPath.delete();

        // create the directory
        Repository repository = FileRepositoryBuilder.create(new File(localPath, ".git"));
        repository.create();

        System.out.println("Having repository: " + repository.getDirectory());

        repository.close();

        FileUtils.deleteDirectory(localPath);
    }
}

任何建议都会有很大的帮助,因为这是我第一次使用JGit。

1 个答案:

答案 0 :(得分:2)

一种可行的方法是将repositoy从服务器克隆到临时位置,然后将其推送到目标服务器。

您可以使用JGit克隆存储库,如下所示:

Git.cloneRepository()
  .setCredentialsProvider( new UsernamePasswordCredentialsProvider( "user", "password" ) );
  .setURI( remoteRepoUrl )
  .setDirectory( localDirectory )
  .setCloneAllBranches( true )
  .call();

要将刚刚克隆的存储库传输到目标,您必须首先在目标服务器上创建存储库。 JGit和Git都不支持这一步。 GitHub提供了一个REST API,可以让您create repositoriesdeveloper pages还列出了此API中可用于Java的语言绑定。

一旦(空)存储库存在,您就可以从临时副本推送到远程:

  Git git = Git.open( localDirectory );
  git.push()
    .setCredentialsProvider( new UsernamePasswordCredentialsProvider( "user",  "password" ) );
    .setRemote( newRemoteRepoUrl )
    .setForce( true )
    .setPushAll()
    .setPushTags()
    .call()

有关身份验证的详细信息,请参阅here

请注意,如果源存储库包含标记,则必须在克隆后单独将这些标记提取到临时存储库中。