JGit подключается к отдельному репозиторию git с помощью .git-файла

#java #git #jgit

#java #git #jgit

Вопрос:

Я использовал "git init --separate-git-dir=C:/repo/.git" и определил другое местоположение для репозитория. Мое рабочее местоположение "C:/work/" .

В рабочем расположении git создает .git-file со ссылкой на местоположение репозитория.

Когда я использую JGit, я не могу подключиться к своему репозиторию:

 
Git
   .open(new File("C:\work\.git"))
   .reset()
   .setMode(ResetType.HARD)
   .call();

  

Затем я получаю исключение:

 Exception in thread "main" org.eclipse.jgit.errors.RepositoryNotFoundException: repository not found: C:work.git
    at org.eclipse.jgit.lib.BaseRepositoryBuilder.build(BaseRepositoryBuilder.java:582)
    at org.eclipse.jgit.api.Git.open(Git.java:117)
    at org.eclipse.jgit.api.Git.open(Git.java:99)
    at de.test.git.App.main(App.java:20)

  

Как подключиться к моему репозиторию?

Спасибо за помощь.

Редактировать:

Спасибо Джони, который нашел решение моей проблемы.

Спасибо, Джони! Ты потрясающий! Я попробовал это, как вы написали, с настройкой рабочего дерева, и это работает как шарм. Кстати, я нашел возможность выполнить эти шаги, не зная, где находится репозиторий. Для тех, кто интересуется:

 Repository repo = new FileRepositoryBuilder() 
   .findGitDir(new File("C:\work"))
   .setWorkTree(new File("C:\work"))
   .build(); 

Git git  = new Git(repo); 
git
   .reset()
   .setMode(ResetType.HARD)
   .call(); 
git.close(); 

  

Комментарии:

1. Вы уверены, что правильно клонировали свой репозиторий в C:work ? Можете ли вы подтвердить другим инструментом, что он согласован? Также, пожалуйста, попробуйте new File("C:\work") и позвольте JGit самому обнаружить ваш .git каталог

2. Я не клонировал репозиторий. Я создал с помощью git init новый локальный репозиторий и с помощью —separate-git-dir привязал к местоположению репозитория. В моем рабочем месте есть только .git-файл (не репозиторий). Я пытался new File("C:\work") , но это тоже не сработало.

3. Когда я использую Git Bash в Windows на рабочем месте, я могу использовать git reset --hard , в то время как Git Bash также может подключаться к репозиторию. Только JGit не может подключиться к репозиторию через связанный «.git-файл».

Ответ №1:

Похоже, что JGit (пока) не поддерживает эту --separate-git-dir опцию.

В качестве обходного пути вы можете напрямую открыть связанный репозиторий:

 Git
   .open(new File("C:/repo/.git"))
   .reset()
   .setMode(ResetType.HARD)
   .call();
  

При подобном использовании JGit не будет знать, где находится ваш рабочий каталог, поэтому я полагаю, что все, что связано с рабочим каталогом, завершится неудачей. Следуя руководству пользователя, вы можете создать настраиваемый Repository объект, подобный этому:

 FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repository = builder.setGitDir(new File("C:/repo/.git"))
  .setWorkTree(new File("C:/work"))
  .readEnvironment() // scan environment GIT_* variables
  .build();
  

А затем использует Git(Repository) конструктор вместо Git.open :

 Git git = new Git(repository);
git.reset()
   .setMode(ResetType.HARD)
   .call();
  

Комментарии:

1. Спасибо за вашу идею! Я попытался открыть репозиторий напрямую, и это сработало. Но есть другая проблема. При сбросе рабочее местоположение не будет сброшено. Будет сброшен только сам репозиторий, и git вставит сброшенные файлы в расположение репозитория относительно .git-directory.

2. Спасибо, Джони! Ты потрясающий! Я попробовал это, как вы написали, с настройкой рабочего дерева, и это работает как шарм. Кстати, я нашел возможность выполнить эти шаги, не зная, где находится репозиторий. Для тех, кто интересуется: « Repository repo = new FileRepositoryBuilder() .findGitDir(новый файл(«C:\work «)) .setWorkTree(новый файл(«C:\work «)) .build(); Git git = новый Git(репозиторий); git.reset().setMode(resetType.HARD).call(); git.close(); «