2012-04-12 11 views
8

Un JGit-principiante-pregunta:comisión de una serie con JGit

utilizo JGit para leer un archivo (BLOB) desde un repositorio y manipular su contenido. Después de eso, quiero escribir el nuevo contenido con el mismo nombre de archivo en el repositorio como una nueva confirmación. ¿Pero cómo puedo comprometer el nuevo contenido con JGit?

Mi pseudo-código:

String gitUrl = "path/to/repository/.git"; 
Repository repository = new FileRepository(gitUrl); 
String filename = "test/seppl.txt"; 
blobId = getIdOf(filename); 
ObjectLoader object = repository.open(blobId, Constants.OBJ_BLOB); 
ObjectStream is = object.openStream(); 
String newContent = processStream(is); 
// How to commit the newContent in filename? 

¿Tengo que escribir el newContent en un archivo y cometer este archivo con el AddCommand y CommitCommand? ¿O puedo escribir la cadena "sobre la marcha" en el repositorio bajo el mismo nombre de archivo?

¿Hay algún lugar en la web, por ejemplo, cómo hacer una confirmación con JGit?

+0

En cuanto a un ejemplo de CommitCommand, sugiero que eche un vistazo a mi respuesta [aquí] (http://stackoverflow.com/questions/6861881/jgit-cannot-find-a-tutorial-or-simple- ejemplo/10311069 # 10311069). –

+1

También recomiendo usar la API de porcelana (es decir, 'AddCommand',' CommitCommand') como se sugiere en las respuestas, pero si realmente desea confirmar _sobre la marcha_, puede encontrar útil este artículo :: http: //www.codeaffine .com/2014/10/20/git-internals/ –

Respuesta

6

Creo que no hay otra manera de confirmar ningún dato que el uso de CommitCommand (excepto la fusión o las operaciones que son muy específicas).

Así que, sí, debe hacer cualquier cambio en su archivo y luego agregarlo y confirmarlo (usando AddCommand y CommitCommand desde la API).

+0

Ok, intentaré esto, ya que parece ser la manera más fácil y tal vez optimizarlo más adelante. – Sonson123

3

Es posible que desee examinar el uso de Blob en Git. Esta técnica se usa para almacenar las claves públicas de PGP cuando se firman etiquetas. Parece que el contenido que desea todavía tiene que colocarse en un archivo, pero puede ser un archivo temporal. El archivo no existirá en el directorio principal cuando alguien haga un pull. Será una entrada en el árbol como una burbuja.

http://book.git-scm.com/7_raw_git.html

El -w dice que para escribir la entrada, junto con la devolución del hash.

git hash-object -w myfile.txt 
6ff87c4664981e4397625791c8ea3bbb5f2279a3 

actualización

I desnatada a través de esta entrada en mi teléfono y por lo tanto era menos atento a los detalles que nos ha facilitado. Sí, necesitaría escribir la cadena en un archivo, pero no, no debería tener que agregarlo como un archivo normal. Sospecho que JGit tiene la capacidad de hacer hash-object. Parece que ya tiene algún código para manejar una entrada BLOB. Quizás haya un llamado de nivel superior para hash-object en el que no se maneje directamente el BLOB.

Teniendo en cuenta que todo en Git se basa en hash de contenido, diría que, incluso si encontrara una forma de escribir la cadena directamente, no debería hacerlo. Debe renovar el objeto con el mismo nombre de archivo para que obtenga un nuevo hash y una entrada actualizada.

+0

Hm, muy interesante, gracias. Pero me quedaré con el Add/CommitCommand porque ahora es el más fácil. – Sonson123

3

Sí, por supuesto que puede hacer lo que quiera, pero simplemente no mediante Agregar/Commit, ya que son parte de la alto nivelPorcelein API que es sólo una API conveniencia construido en la parte superior a la baja nivel de API. Por lo tanto, simplemente implementan los casos de uso más comunes.

Lo que debe hacer es observar la implementación de AddCommand y CommitCommand para ver cómo usar la API de nivel inferior para crear objetos BLOB y luego objetos en árbol y objetos de confirmación.

Recomendaría la recomendación que minuciosamente read chapter 9 of the Pro Git book para que entienda correctamente cómo funciona Git en un nivel bajo.

Cuestiones relacionadas