jGit: cómo agregar todos los files al área de ensayo

Intenté de muchas maneras clonar un repository con jGit (funciona). Luego, escribí un file en el repository e intenté agregar todo (un git add * , git add -A o algo parecido) … pero no funciona. Los files simples no se agregan al área de ensayo.

Mi código es así:

  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("git@192.168.2.43: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(); 

¿Qué estoy haciendo mal? Gracias.


Excepción al intentar lo que con 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) 

Una manera fácil de solucionar esto es ver las testings de AddCommand en el repository de AddCommandTest.java : AddCommandTest.java

Verá que para agregar todos los files, el patrón " * " nunca se usa, pero " . " Es.
Y se usa en la function de testing llamada … testAddWholeRepo() (!)

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

La exception:

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

es bastante explícito: necesitas agregar un file en un repository no desnudo.

Vea el método de testing testCloneRepository() para compararlo con su propio clon, y vea si hay alguna diferencia.

Tuve una situación en la que tuve que mover un file f1 del directory actual a otro directory llamado 'temp'. Después de mover el file, llamar a git.add (). AddFilePattern ("."). Call () actuó de forma extraña ya que el estado de git dio el siguiente resultado:

 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 

Reconoció que se creó un nuevo file temp / f1 pero no detectó que el file se eliminó primero. Esto fue quizás porque mover el file se puede ver de la siguiente manera

  • Eliminar / Cortar el file f1
  • Creando una carpeta llamada temp
  • Creando / Pegando el file f1

Luego me encontré con el setUpdate(true) que busca actualizaciones para los files que ya están siendo rastreados y no creará nuevos files. (Consulte java-doc para get más información)

Así que tuve que cambiar mi código a dos líneas como para que git reconozca los dos files agregados y modificados (que incluye la eliminación):

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

El estado de git ahora da el resultado esperado:

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

Puede ser el comodín, acabo de leer el command javadoc para agregar, parece que envía el nombre de un directory para agregar sus contenidos y no un comodín:

 addFilepattern public AddCommand addFilepattern(String filepattern) 

Parámetros: filepattern – Archivo para agregar contenido. También se puede dar un nombre de directory principal (por ejemplo, dir para agregar dir/file1 y dir/file2 ) para agregar todos los files en el directory , recursivamente. Fileglobs (ej. *.c ) aún no son compatibles.