2011-09-16 13 views
8

tl; dr JGit de checkout lanza excepciones, mientras que la línea de comandos git checkout funciona bienJGit pago y envío vs `problemas checkout` git

Actualmente estoy tratando de usar JGit de revisar algunas revisiones desde un repositorio Git en línea, en Java (para el trabajo). Mi enfoque actual es (y yo soy muy nuevo en Git, que viene de un fondo SVN, por lo que esto puede ser malo):

  • clon del repositorio en una ubicación temporal en el disco duro
  • averiguar qué revisión que quiero, (he intentado usar el hash SHA-1 así como el nombre de una rama)
  • pago y envío esa revisión
  • desde allí, estaría utilizando los archivos desprotegidos como entradas a una parte posterior de el programa.
  • pago y envío de una revisión diferente
  • uso esos archivos como entradas a otra parte del programa

Esencialmente, quiero ser capaz de cambiar el contenido de mi carpeta de archivos temporales con cualquier revisión. Con la interfaz de línea de comandos, pude hacer esto con git checkout master y git checkout dylanbranch (donde dylanbranch es una rama que hice en mi propio clon con una revisión arbitrariamente elegida), pero mi código Java que intenta hacer lo mismo falla:

Git git = Git.open(new File("checkout")); //checkout is the folder with .git 
git.checkout().setName("master").call(); //succeeds 
git.checkout().setName("dylanbranch").call(); //fails 

y las excepciones imprimen en la consola:

Exception in thread "main" org.eclipse.jgit.api.errors.JGitInternalException: Checkout conflict with files: 
src/sizzle 
test/qunit 
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:211) 
    at com.avi.scm.git.BranchCheckout.main(BranchCheckout.java:30) 
Caused by: org.eclipse.jgit.errors.CheckoutConflictException: Checkout conflict with files: 
src/sizzle 
test/qunit 
    at org.eclipse.jgit.dircache.DirCacheCheckout.checkout(DirCacheCheckout.java:387) 
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:162) 
    ... 1 more 

puedo comprobar que los archivos en cuestión están marcados como borrada y no organizadas a comprometerse mediante el uso de git status aunque no estoy seguro de por qué estos cambios son allí, y vuelven cada vez que cambio a la rama principal. A pesar de eso, todavía puedo cambiar con éxito el árbol de trabajo con la línea de comando Git.

Así que mi pregunta: ¿Por qué no trabajo JGit para esta aplicación cuando la línea de comandos Git? Cualquier otra información útil se appreciated- educarme :)

actualización He estado probando con el repositorio de jQuery, y he notado un poco más de problemas con JGit: Cuando estoy trabajando con la rama "master", git status me dice que soy #On branch master y que hay nothing to commit (working directory clean), pero usando el comando de estado de JGit veo que test/qunit y src/sizzle están marcados como Missing. El reinicio de JGit parece no hacer nada.

Respuesta

2

Los dos directorios mencionados en el seguimiento de la pila son Git submodules (test/qunit y src/sizzle) que es muy probable que la causa del problema, ya que JGit no tiene el apoyo submódulo completa todavía .

Esto puede funcionar de manera diferente en la versión 1.1 JGit que saldrá este mes basado en este commit.

Puede leer más sobre el estado actual del soporte del submódulo JGit here.

+0

Gracias por los enlaces, +1 Para cualquier otra persona que intente hacer lo mismo, mi plan actual de ataque es cometer los "cambios" que JGit ve solo para poder verificar otras cosas. (Esencialmente ignorar los submódulos, al igual que JGit) – Dylan

+0

Puede probar la versión de JGit [aquí] (https://hudson.eclipse.org/hudson/job/jgit/855/artifact/org.eclipse.jgit.packaging/org. eclipse.jgit.updatesite/target/site/plugins/org.eclipse.jgit_1.2.0.201109151733.jar) y vea si obtiene las mismas excepciones de conflicto? –

+0

Esa versión más reciente soluciona mi problema (aunque ahora el comando clonar se rompe cuando intentas anular/actualizar tu copia existente). – Dylan

0

Sé que esto no directamente responde a su pregunta, pero también he tenido problemas con las implementaciones de Java de Git. Lo que funcionó mejor para mí fue simplemente eliminar las implementaciones de java y ejecutar llamadas de línea de comandos a git desde dentro de la aplicación. Puede que no sea lo ideal, pero hará exactamente lo que usted desea ya que controlará completamente el comando.

Simplemente llame Runtime.getRuntime().exec(...)

Link to Javadoc for Runtime class

+1

Estoy de acuerdo en que el Runtime funcionaría en mi propio sistema, pero no tenemos garantía de que los usuarios tengan 'git' disponible en sus sistemas, y espero evitar tener que distribuir los binarios específicos del os. – Dylan

0

Tuve un problema similar con Checkout. Creo que el hecho de que puedas cambiar de rama con contenido no grabado en Git es en realidad una tolerancia, no una función. JGit no es tan tolerante a nivel mundial como Git, por lo que generalmente debería probar muchos casos.

Parece que no es directamente su problema (que está relacionado con los submódulos), pero para casos más generales, le conviene confirmar los cambios antes de usar el pago y envío para cambiar a otra sucursal.

Tenga en cuenta que CheckoutCommand funciona perfectamente para mí para iniciar una nueva rama de una revisión anterior (debe establecer el nombre de la rama y la revisión de inicio).

Cuestiones relacionadas