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)
Ответы
Ответ 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
) еще не поддерживается.