Cómo agrego un file sin cambios al índice git

Estoy escribiendo una herramienta que tiene que mantener el historial de files (generados) en un repository de Git.

Una de las requestes es que debo ser capaz de tomar todo lo que se generó en una confirmación específica y reproducirlos en otra twig.

En la superficie, se parece mucho a una recolección de cerezas, pero hay matices que hacen que esto sea un poco diferente.

Cada confirmación genera un set de files en el tree de trabajo. Es posible que algunos files ya existan en el tree de trabajo, y muy a menudo, el contenido generado no cambia desde la versión en el tree de trabajo.

En algún momento posterior, debo ser capaz de tomar la list de files que se generaron para la confirmación anterior (sin importar si el contenido se modificó o no) y copyrlos a otra twig.

Mi primera pregunta es: ¿Puedo agregar un file al índice git (y finalmente comprometerlo) incluso si su contenido no ha cambiado?

Si voy a tener que trabajar con git internas para eso, todavía está bien. Solo necesito asegurarme de que no rompa el repository git para otras herramientas git.

Estoy usando Java y la biblioteca jGit de código abierto para interactuar con el repository de Git, por lo que mi segunda pregunta es si esto es posible en jGit

En caso afirmativo, algunos indicadores API serían muy apreciados.

Gracias.

Para responder a su pregunta explícita: si un file existió en su confirmación anterior, y su contenido no ha cambiado en absoluto (aunque sus metadatos pueden tener), entonces el file ya está en el índice. Inmediatamente después de una confirmación, el índice contiene el contenido exacto de esa confirmación. Agregar / eliminar cambios hace las modificaciones apropiadas al índice para prepararse para la siguiente confirmación. En contraste con algunas otras respuestas / comentarios, git no almacena cambios: almacena instantáneas completas de su directory de trabajo (o al less las partes no ignoradas y no rastreadas). Calcula los cambios cuando se lo pide, pero no los almacena (al less desde la perspectiva del front-end de git : la database de objects subyacente usará deltas para networkingucir la cantidad de espacio requerido, pero los deltas que utiliza pueden no estar entre versiones consecutivas de un file, y puede que ni siquiera esté entre dos versiones del mismo file si tiene files que son significativamente similares).

Para responder a lo que parece que quieres hacer, tal vez quieras investigar la git reset --merge . Si eso no es exactamente lo que quiere, puede hacer algo como esto, que cambiará el directory de trabajo actual para que coincida con una confirmación específica, y luego lo confirmará como una nueva confirmación, esencialmente copyndo la instantánea representada por la confirmación fuente, que es probablemente en una twig diferente o posiblemente antes en la twig actual, y realice una nueva confirmación que se vea como tal, excepto por lo que se considera que es la confirmación principal:

 git rm -r * git archive --format=tar <commit> | tar xpf - git add -A . git commit -m "snapshot copy of commit <commit>" 

Puede usar git archive --format=zip <commit> -o /tmp/somefile.zip; unzip /tmp/somefile.zip git archive --format=zip <commit> -o /tmp/somefile.zip; unzip /tmp/somefile.zip también, pero prefiero usar el formatting tar ya que solo puedes canalizarlo …

Parece que el git update-index está dedicado a la manipulación del índice. Debería encontrar lo que necesita en su documentation .

Git almacena cambios, no files. Es mejor utilizar algo más adecuado para el almacenamiento de files y el sellado de time (database) y luego el control de la versión.

Para forzar la idea de hacer lo que quieras en git, lo único que se me ocurre es que el generador agregue un número de compilation o semilla única MD5 + (time.now) al file para que git vea un cambio que puede entonces comprometerse

Pero nuevamente, esto huele a que la solución no encaja en el problema. ¿Está absolutamente seguro de que usar un sistema de control de versiones para registrar las ejecuciones de un script generador es la herramienta adecuada para el trabajo?

En primer lugar, tengo que git que probablemente git no sea el path correcto.

El rest de esta respuesta se encuentra en algún lugar entre la experimentación y el feo mundo de hackeo.

Lo que viene a la mente es tener en su repository un file que tendrá la estructura de sus files dentro, por ejemplo, repo_files .

A continuación, puede implementar un gancho para agregar los nuevos files a repo_files .

Entonces, en cualquier momento, tendrá la posibilidad de conocer el repository más los files vacíos que necesita.

Con estos implementado puede escribir algunos commands de git personalizados para hacer lo que necesita

p.ej:

  • generate_repo_files que rellena el file repo_files
  • commit_empty_file que simplemente agregará el file a repo_files
  • checkout_with_files que hará un checkout y tocará los files que faltan
  • remove_files que eliminará los files vacíos de repo_files