Как использовать jgit для клонирования существующих репозиториев в новый экземпляр github?

У нас есть два отдельных запущенных экземпляра GitHub. Один экземпляр GitHub — https://github.dev.host.com, а другой — 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, я хочу создать эти два вышеперечисленных репозитория в моем новом экземпляре GitHub с помощью кода Java. И после запуска моего 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.


person john    schedule 07.02.2015    source источник


Ответы (1)


Целесообразно клонировать репозиторий с исходного сервера во временное место и оттуда отправить его на целевой сервер.

Вы можете клонировать репозиторий с помощью JGit следующим образом:

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

Чтобы передать только что клонированный репозиторий в место назначения, вы должны сначала создать репозиторий на целевом сервере. Ни JGit, ни Git не поддерживают этот шаг. GitHub предлагает REST API, который позволяет вам создавать репозитории. На страницах разработчиков также перечислены языковые привязки, доступные для этого API, включая Java.

Как только появится (пустой) репозиторий, вы можете нажать временную копию на удаленную:

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

Дополнительную информацию об аутентификации можно найти здесь

Обратите внимание, что если исходный репозиторий содержит теги, их необходимо отдельно загрузить во временный репозиторий после клонирования.

person Rüdiger Herrmann    schedule 07.02.2015
comment
Спасибо за помощь. Теперь у меня есть идея, что мне нужно сделать. Итак, я думаю, лучший подход — клонировать два вышеупомянутых репозитория во временное место, а затем оттуда отправить их на целевой сервер, который является моим новым экземпляром github? Правильно ли я понимаю? - person john; 07.02.2015
comment
@david Да, это то, что предлагает мой ответ - person Rüdiger Herrmann; 08.02.2015
comment
Конечно понял. Еще одна вещь, во втором фрагменте кода, который отправляет изменения localDirectory в пункт назначения. В моем случае это место назначения для этого нового экземпляра github https://github.host.com, но как этот второй фрагмент кода узнает, что мне нужно отправить изменения localDirectory в этот новый экземпляр github? - person john; 08.02.2015
comment
Боюсь, я не совсем понимаю вопроса. Каталог, указанный в Git.open(), указывает репозиторий. Переменная git действует как фабрика для команд, а ее метод push() возвращает PushCommand, который работает с localRepository. Подробнее о доступе к репозиториям с помощью JGit можно узнать здесь< /а>. - person Rüdiger Herrmann; 08.02.2015
comment
Извините, если я не был ясен ранее. Я хочу сказать, что у меня есть один репозиторий в этом экземпляре github https://github.dev.host.com, который мне нужно перенести в этот новый экземпляр Github https://github.host.com. Итак, я клонирую репозиторий из моего первого экземпляра github с вашим первым фрагментом кода, но во втором фрагменте кода, как он узнает, что мне нужно отправить эти изменения localDirectory в мой новый экземпляр github (https://github.host.com). Я обновил вопрос кодом, который я должен сделать, чтобы было более понятно, что я пытаюсь спросить. - person john; 08.02.2015
comment
Извини, я виноват. Я упустил из виду, что пульт не был указан. Смотрите обновленный ответ. - person Rüdiger Herrmann; 09.02.2015
comment
Большое спасибо. Это то, что я искал. И последнее, если localDirectory уже существует, то на данный момент он выдает исключение Destination path "ClientService" already exists and is not an empty directory. Есть ли способ заставить клонировать существующий каталог? - person john; 09.02.2015
comment
Нет, почему бы вам просто не удалить содержимое каталога перед клонированием? - person Rüdiger Herrmann; 09.02.2015
comment
Да, это был мой другой вариант, если принудительное клонирование не сработало. - person john; 09.02.2015
comment
У меня есть еще один принципиальный вопрос. Предположим, у меня есть две ветки (главная и промежуточная) в github.dev.host.com, тогда с описанным выше подходом она будет толкать главную ветку только из github.dev.host.com в github.host.com в том же репозитории. Верно? Можно ли каким-либо образом переместить все ветки репозитория с одного github на другой github в моем случае? - person john; 19.02.2015
comment
Я изменил ответ. PushCommand уже отправил все ветки (используя setPushAll()). С setCloneAllBranches( true ) CloneCommand теперь должен клонировать все ветки из исходного репозитория. - person Rüdiger Herrmann; 19.02.2015
comment
Спасибо за помощь. Теперь очень хорошо понял. Оценил вашу помощь. - person john; 22.02.2015