2012-07-03 1 views
4

У меня есть голый репозиторий, расположенный в main.git и пытаюсь принести ветку (foo, скажем) в другой репо, test, который только был git init «d:Git принести неудачу с помощью jgit: Remote не <branchname> доступны для выборки

fetchtest/ 
    |- main.git/ 
    |- test/ 
     |- .git/ 

Использование регулярных команд Git, я могу сделать git fetch ../main.git foo:foo и это сделает новый филиал foo в test/ и извлечения объектов, необходимых для отрасли. Затем я хочу сделать то же самое, но программно с помощью JGit, т. Е. Не используя GIT CLI, но используя только код Java. Там нет никакого способа, я могу использовать GIT CLI:

Git git = Git.init().setDirectory(new File("fetchtest/test/")).call(); 

git.fetch().setRemote(new File("../main.git")) 
      .setRefSpecs(new RefSpec("foo:foo")) 
      .call(); 

но это просто ошибки с:

org.eclipse.jgit.api.errors.TransportException: Remote does not have foo available for fetch. 
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:137) 
    // ...... 
Caused by: org.eclipse.jgit.errors.TransportException: Remote does not have foo available for fetch. 
    at org.eclipse.jgit.transport.FetchProcess.expandSingle(FetchProcess.java:349) 
    at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:139) 
    at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:113) 
    at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1069) 
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128) 

Как получить эту работу?

+0

Ответ вы * не * ищу: узнать ** командной строки мерзавец ** d = – dcow

+1

@David: Я хотел бы добавить, что я * не * использовать командную строку мерзавца - я должен использовать его программно , (J) Git на самом деле является частью приложения, которое я создаю, которое будет запущено на аппаратном обеспечении клиента, и git не будет установлен (и я не хочу его устанавливать, будучи больно настроен на окна). Единственное, что у них будет, это Java. –

+0

Несомненно. Я просто играл .. – dcow

ответ

4

Что должно работать:

Git git = Git.init().setDirectory(new File("fetchtest/test/")).call(); 

git.fetch().setRemote(new File("../main.git")) 
      .setRefSpecs(new RefSpec("refs/heads/foo:refs/heads/foo")) 
      .call(); 

Обратите внимание на RefSpec определение.
По крайней мере, попробовать в вашем примере:

new RefSpec("refs/heads/foo:refs/heads/foo") 

RefSpec class упоминает:

/** 
* Parse a ref specification for use during transport operations. 
* <p> 
* Specifications are typically one of the following forms: 
* <ul> 
* <li><code>refs/head/master</code></li> 
* <li><code>refs/head/master:refs/remotes/origin/master</code></li> 
* <li><code>refs/head/*:refs/remotes/origin/*</code></li> 
* <li><code>+refs/head/master</code></li> 
* <li><code>+refs/head/master:refs/remotes/origin/master</code></li> 
* <li><code>+refs/head/*:refs/remotes/origin/*</code></li> 
* <li><code>:refs/head/master</code></li> 
* </ul> 
* 
* @param spec 
* string describing the specification. 
* @throws IllegalArgumentException 
* the specification is invalid. 
*/ 

Так "refs/head/" кажется обязательным.


Оригинальный ответ:

setRemote() function on api.FetchCommand принимает имя или URI.

И глядя на определение FetchCommandTest URI, я предпочитаю сделать пульт более заметным:
я предпочел бы определить именованный удаленного (здесь ниже: «test») для второго репо (имеется в виду ваш первый репо), а затем выборки.

// setup the first repository to fetch from the second repository 
final StoredConfig config = db.getConfig(); 
RemoteConfig remoteConfig = new RemoteConfig(config, "test"); 
URIish uri = new URIish(db2.getDirectory().toURI().toURL()); 
remoteConfig.addURI(uri); 
remoteConfig.update(config); 
config.save(); 

// create some refs via commits and tag 
RevCommit commit = git2.commit().setMessage("initial commit").call(); 
Ref tagRef = git2.tag().setName("tag").call(); 

Git git1 = new Git(db); 

RefSpec spec = new RefSpec("refs/heads/master:refs/heads/x"); 
git1.fetch().setRemote("test").setRefSpecs(spec) 
.call(); 
+0

Спасибо за ответ, я попробую ваши предложения.Я думаю, что относительный путь должен работать (я фактически использую 'новый файл (relativePath) .getAbsolutePath()'), и это также работает для команд push. –

+0

@CallumRogers Я только что отредактировал ответ, чтобы добавить примечание к 'RefSpec'. – VonC

+1

Отлично! Теперь он работает - проблема, как вы правильно поняли, заключалась в том, что для каждой ветви в 'RefSpec' необходимо использовать полный' refs/heads/foo'! Огромное спасибо. –

0

Иногда Eclipse не понимает изменения до тех пор, пока вы не создадите свои изменения. Если в вашем проекте есть какие-либо ошибки, Eclipse не будет создавать такой проект. Убедитесь, что вы создали проект, который использует Git, и попробуйте разрешить любые ошибки в пути сборки. Я не знаю Git, но это похоже на проблему обновления. Попробуйте и сообщите мне, если это решило вашу проблему или нет.

+0

Я не вижу, как это относится к jgit? Проект строит отлично - вы должны заметить, что я использую (j) git программно, а git cli/egit не входит в это. –

+0

Вы можете установить автоматическое обновление в положение «включено» в настройках рабочей области IIRC. – sjas

 Смежные вопросы

  • Нет связанных вопросов^_^