2010-11-20 11 views
13

¿Puede GIT confirmar versiones vacías de algunos archivos? El caso es que necesito que los archivos nuevos (sin seguimiento) se agreguen primero y se cometan como archivos vacíos, para marcar su contenido como nuevo y para revisar (los archivos completos sin seguimiento deben agregarse no). al índice; git diff debe mostrar los contenidos recién agregados comparando el archivo con su versión vacía confirmada).¿Puede cometer Git "versiones vacías" de archivos nuevos?

Hay git add -N file…, lo que pone file con un contenido vacío en el índice, pero esto sólo dice que filese añadirá y git commit se queja de que el archivo no se ha añadido. Lo que sucede es que la versión actual no vacía no es lo que se debe agregar, sino solo una versión vacía del nuevo archivo.

¿Hay alguna manera de hacerlo?

PD: Esta pregunta se realiza en el contexto de un programa que agrega automáticamente archivos a un repositorio de git (mi programa sigue el código que escriben los estudiantes). El código no comprometido es un código que aún no he aprobado. Por lo tanto, el estado en el que se inicia un programa creado por un alumno debe ser el estado vacío, aunque mi programa acaba de encontrar un programa nuevo, no vacío en su directorio principal; esto se maneja al comprometer automáticamente una nueva versión vacía de cualquier nuevo archivo de programa de estudiante en un repositorio de git. Por lo tanto, las nuevas líneas de código que escriben aparecen como contenido recién agregado, en comparación con la última revisión de git comprometida.

+1

Sinceramente, no entiendo su problema. 'touch empty-file && git add empty-file && git commit' funciona para mí. – joschi

+0

'git diff' funciona perfectamente bien para un archivo recién creado. Si difiere un estado cuando el archivo no existía con un diff cuando tiene contenido, verá todas las líneas agregadas, exactamente la misma diferencia que difiere de un archivo vacío. (Solo las modelos son diferentes.) – Cascabel

+1

@joschi: El problema es que tengo muchos archivos nuevos, * no vacíos *. Usar el enfoque # 1 de Sven es más engorroso que usar su enfoque limpio de plomería. – EOL

Respuesta

29

Para ser sincero, realmente no entiendo para qué sirve esto. Intentaría arreglar el proceso de revisión en lugar de estropear el historial. Pero si realmente quieres hacer esto, aquí hay varias maneras de cómo:

  1. El enfoque pragmático:

    mv file out-of-way 
    touch file 
    git add file 
    mv out-of-way file 
    
  2. El enfoque de porcelana:

    git add -N file 
    git add -p file 
    

    ... y justo responda "no" cuando se le pregunte si debe agregarse el único trozo.

  3. El enfoque de plomería:

    En primer lugar, asegúrese de que existe un objeto vacío en la base de datos de objetos:

    git hash-object -w --stdin < /dev/null 
    

    Esto devolverá el SHA1 de una burbuja vacía (que es e69de29bb2d1d6434b8b29ae775ad8c2e48c5391). Tienes que crear este objeto solo una vez. Ahora usted puede crear archivos vacíos en el índice por

    git update-index --add --cacheinfo 0644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file 
    
+0

@Sven: Muchísimas gracias ! El enfoque de fontanería es perfecto para mí: es fácil de automatizar, y va al grano (aunque la segunda adivinación de por qué necesitaría esto no es tan relevante :)). Esto es útil para seguir el nuevo código que mis alumnos agregan a su directorio de inicio usando 'git diff' en mis copias locales de sus programas. El código que aún no he aprobado no debe comprometerse, pero sigue apareciendo como líneas recién agregadas (en comparación con un archivo vacío), siempre que no se haya confirmado (es decir, aprobado). – EOL

+0

@EOL: también puede automatizar fácilmente el toque, agregar, * luego * copiar. – Cascabel

+0

@EOL: Perdón por sonar desagradable, solo quería señalar que no recomiendo hacer lo que expliqué en esta respuesta. Creo que los enfoques que sugiere Jefromi en los comentarios a su pregunta brindan flujos de trabajo más flexibles (y más confiables). –

Cuestiones relacionadas