2012-10-04 20 views
12

Intenté de muchas maneras clonar un repositorio con jGit (funciona). Luego, escribí algunos archivos en el repositorio e intenté agregar todos (un git add *, git add -A o algo así) ... pero no funciona. Los archivos simples no se agregan al área de ensayo.jGit - cómo agregar todos los archivos 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("[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(); 

¿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) 

Respuesta

17

Una forma fácil de depurar este es mirar a las pruebas del AddCommand en el JGit repo: AddCommandTest.java

Verá que para agregar todos los archivos, el patrón "*" nunca se usa, pero "." es.
Y se utiliza en la función de prueba llamado ... testAddWholeRepo()

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

La Excepción (!):

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

es bastante explícito: se debe añadir el archivo en un acuerdo de recompra no desnuda .

Consulte test method testCloneRepository() para comparar con su propio clon, y vea si hay alguna diferencia.

+0

gracias, pero tengo una excepción. Lo pondré en la pregunta – caarlos0

+0

@ caarlos0 respuesta editada – VonC

+0

Pero lo cloné como un repositorio no desnudo ... No entiendo lo que se supone que debo hacer ... – caarlos0

1

Podría ser el comodín, acabo de leer el Javadoc para el comando add, parece que se envía el nombre de un directorio con el fin de añadir su no contenidos un comodín:

addFilepattern 

public AddCommand addFilepattern(String filepattern) 

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

3

Tuve una situación en la que tuve que mover un archivo f1 del directorio actual a otro directorio llamado 'temp'. .. Después de mover el archivo, llamando git.add() addFilePattern ("") llamada() actuó de una manera extraña desde git status 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 

Se reconoce que un nuevo archivo temporal/Se creó f1 pero no detectó que el archivo se eliminó primero.Este fue quizás porque mover el archivo se puede ver de la siguiente manera

  • Eliminación/Cortar el archivo F1
  • Creación de una carpeta llamada temp
  • Creación/pegar el archivo F1

Y vine a través del setUpdate(true) que busca actualizaciones de archivos que ya están siendo rastreados y no creará nuevos archivos. (Marque java-doc para obtener más información)

Así que tuve que cambiar el código para dos líneas como lo que a fin de git para reconocer ambos archivos añadidos y modificados (que incluye la eliminación):

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

git el estado ahora da el resultado esperado:

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