Проблемы с JGit checkout и `git checkout` - PullRequest
       10

Проблемы с JGit checkout и `git checkout`

8 голосов
/ 16 сентября 2011

tl; dr JGit's checkout генерирует исключения, в то время как командная строка git checkout работает нормально

В настоящее время я пытаюсь использовать JGit для проверки определенных ревизий из онлайн-хранилища Git на Java (для работы). Мой текущий подход (и я очень новичок в Git, исходя из фона SVN, так что это может быть неправильно):

  • клонировать репозиторий во временную папку на моем жестком диске
  • выяснить, какую ревизию я хочу, (я пытался использовать хэш SHA-1, а также имя ветви)
  • оформить ревизию
  • оттуда я буду использовать извлеченные файлы в качестве входных данных для более поздней части программы.
  • оформить заказ на другую ревизию
  • использовать эти файлы в качестве входных данных для другой части программы

По сути, я хочу иметь возможность обмениваться содержимым моей временной папки с любой ревизией. С помощью интерфейса командной строки я смог сделать это с git checkout master и git checkout dylanbranch (где dylanbranch - ветвь, которую я сделал на своем собственном клоне с произвольно выбранной ревизией), но мой Java-код пытается сделать то же самое не удается:

Git git = Git.open(new File("checkout")); //checkout is the folder with .git
git.checkout().setName("master").call(); //succeeds
git.checkout().setName("dylanbranch").call(); //fails

И исключения, напечатанные на консоли:

Exception in thread "main" org.eclipse.jgit.api.errors.JGitInternalException: Checkout conflict with files: 
src/sizzle
test/qunit
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:211)
    at com.avi.scm.git.BranchCheckout.main(BranchCheckout.java:30)
Caused by: org.eclipse.jgit.errors.CheckoutConflictException: Checkout conflict with files: 
src/sizzle
test/qunit
    at org.eclipse.jgit.dircache.DirCacheCheckout.checkout(DirCacheCheckout.java:387)
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:162)
    ... 1 more

Я могу проверить, что рассматриваемые файлы помечены как удаленные и не подготовлены для фиксации, используя git status, хотя я не уверен, почему эти изменения есть, и они возвращаются каждый раз, когда я переключаюсь в основную ветку , Несмотря на это, я все еще могу успешно изменить рабочее дерево с помощью командной строки Git.

Итак, мой вопрос: Почему JGit не будет работать для этого приложения, когда будет работать git из командной строки? Любая другая полезная информация приветствуется - обучите меня :) 1036 *

Обновление Я тестировал с репозиторием jQuery и заметил еще несколько проблем с JGit: когда я работаю с веткой "master", git status говорит мне, что я #On branch master и что есть nothing to commit (working directory clean), но используя команду статуса JGit, я вижу, что test/qunit и src/sizzle помечены как Missing. Сброс JGit, кажется, ничего не делает.

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

В трассировке стека упоминаются два каталога: Подмодули Git (test/qunit и src/sizzle), что, скорее всего, является причиной проблемы, поскольку JGit пока не имеет полной поддержки подмодулей.

Это может работать по-другому в выпуске 1.1 JGit, который выйдет в этом месяце на основе этого коммита .

Подробнее о текущем состоянии поддержки подмодуля JGit можно узнать здесь .

0 голосов
/ 17 ноября 2011

У меня была похожая проблема с Checkout. Я думаю, что тот факт, что вы можете переключать ветку с неподключенным контентом в Git, на самом деле является допуском, а не функцией. JGit глобально не так терпим, как Git, поэтому вам, как правило, следует тестировать множество случаев.

Похоже, это не ваша проблема (которая связана с подмодулями), но в более общих случаях вы хотели бы зафиксировать свои изменения перед использованием checkout для переключения на другую ветку.

Обратите внимание, что CheckoutCommand отлично работает для меня, чтобы начать новую ветку со старой ревизии (вы должны установить имя ветви и начальную ревизию).

0 голосов
/ 16 сентября 2011

Я знаю, что это не напрямую отвечает на ваш вопрос, но у меня также были проблемы с реализациями Java в Git.Для меня лучше всего было просто отказаться от реализации java и выполнить вызовы командной строки для git из приложения.Возможно, он не идеален, но он будет делать именно то, что вы хотите, так как вы будете полностью контролировать команду.

Просто позвоните Runtime.getRuntime().exec(...)

Ссылка на Javadoc для класса Runtime

...