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
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.