Подтвердить что ты не робот

JGit - как добавить все файлы в промежуточную область

Я много раз пытался клонировать репо с помощью jGit (он работает). Затем я пишу какой-то архив в репозитории и пытаюсь добавить все (a git add *, git add -A или что-то в этом роде).. но это не сработает. Простые файлы не добавляются в промежуточную область.

Мой код выглядит так:

    FileRepositoryBuilder builder = new FileRepositoryBuilder();
    Repository repository = builder.setGitDir(new File(folder))
            .readEnvironment().findGitDir().setup().build();
    CloneCommand clone = Git.cloneRepository();
    clone.setBare(false).setCloneAllBranches(true);
    clone.setDirectory(f).setURI("[email protected]:test.git");
    try {
        clone.call();
    } catch (GitAPIException e) {
        e.printStackTrace();
    }
    Files.write("testing it...", new File(folder + "/test2.txt"),
            Charsets.UTF_8);
    Git g = new Git(repository);
    g.add().addFilepattern("*").call();

Что я делаю неправильно? Спасибо.


Исключение при попытке с помощью addFilePattern ( "." ):

Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException: Bare Repository has neither a working tree, nor an index
    at org.eclipse.jgit.lib.Repository.getIndexFile(Repository.java:850)
    at org.eclipse.jgit.dircache.DirCache.lock(DirCache.java:264)
    at org.eclipse.jgit.lib.Repository.lockDirCache(Repository.java:906)
    at org.eclipse.jgit.api.AddCommand.call(AddCommand.java:138)
    at net.ciphersec.git.GitTests.main(GitTests.java:110)
4b9b3361

Ответ 1

Один простой способ отладить это - посмотреть на тесты AddCommand в JGit repo: AddCommandTest.java

Вы увидите, что для добавления всех файлов шаблон "*" никогда не используется, но "." есть.
И он используется в тестовой функции с именем... testAddWholeRepo() (!)

git.add().addFilepattern(".").call();

Исключение:

Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException: 
Bare Repository has neither a working tree, nor an index

достаточно явный: вам нужно добавить файл в не-обнаженное репо.

См. метод тестирования testCloneRepository() для сравнения с вашим собственным клоном и посмотрите, есть ли разница.

Ответ 2

У меня была ситуация, когда мне пришлось переместить файл f1 из текущего каталога в другой каталог под названием temp. После перемещения файла вызовите git.add(). AddFilePattern ( "." ). Call() действовал странным образом, так как статус git дал следующий результат:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   temp/f1.html

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    f1.html

Он признал, что создан новый файл temp/f1, но не обнаружил, что файл был удален первым. Возможно, это связано с тем, что перемещение файла можно увидеть следующим образом

  • Удаление/вырезание файла f1
  • Создание папки с именем temp
  • Создание/вставка файла f1

Затем я наткнулся на setUpdate(true), который ищет обновления для файлов, которые уже отслеживаются, и не будет создавать новые файлы. (Проверить java-doc за дополнительной информацией)

Итак, мне пришлось изменить свой код на две строки, например, чтобы git распознал как добавленные и модифицированные файлы (включая удаление):

git.add().addFilepattern(".").call();
git.add().setUpdate(true).addFilepattern(".").call();
Статус

git теперь дает ожидаемый результат:

renamed:    f1.hml -> temp/f1.html

Ответ 3

Это может быть шаблон, я просто прочитал javadoc для команды add, похоже, что вы отправляете имя каталога, чтобы добавить его содержимое, а не wild card:

addFilepattern

public AddCommand addFilepattern(String filepattern)

Параметры: filepattern - Файл для добавления контента. Также ведущий каталог   имя (например, dir для добавления dir/file1 и dir/file2) может быть добавлено, чтобы добавить все    файлы в каталоге, рекурсивно. Fileglobs (например, *.c) еще не    поддерживается.