ver tipos tag modificados log etiquetas crear cambios archivos archivo git

tipos - ¿Cómo representar solo una parte de un nuevo archivo con git?



tipos de etiquetas en git (4)

Me encanta agregar git --interactive . Ahora es parte de mi flujo de trabajo diario.

El problema parece que no funciona con los archivos sin seguimiento. Lo que quiero hacer es rastrear un nuevo archivo, pero solo agregar parte de él, es decir, algunas partes de este nuevo archivo aún no están listas para su puesta en escena.

Por ejemplo, con git add -i, puedo elegir la opción de parche e incluso editar trozos individuales para representar partes del nuevo código, dejando los comentarios del código de depuración sin clasificar. Me encanta trabajar de esta manera porque hace que sea obvio en qué lugares del mega parche en el que estoy trabajando todavía necesito trabajar.

Lamentablemente, parece que no puedo hacer lo mismo con un archivo sin seguimiento. O escenario el archivo completo, o nada. La solución que he estado utilizando es la creación de etapas o incluso la asignación de un nuevo archivo cuando está vacío, y luego la organización de cambios individuales de la manera habitual. Pero esta solución se siente como un truco sucio y cuando me olvido, o cambio de opinión, crea más problemas de los que debería haber.

Entonces, la pregunta es: ¿cómo representar solo una parte de un nuevo archivo, de modo que este nuevo archivo sea rastreado pero dejando la totalidad o parte de su contenido sin grabar?


La forma más fácil de hacer esto (y la puesta en escena interactiva de imho en general) es git gui . Viene incluido con git y debería funcionar en casi todas las plataformas compatibles con git.

Simplemente ejecute git gui y se abrirá una interfaz gráfica de usuario que permite organizar y desmantelar trozos e incluso líneas únicas de archivos rastreados y no rastreados.


Whoa, todo ese negocio de update-index y hash-object parece demasiado complicado. ¿Qué tal esto en su lugar?

git add -N new_file git add -i

De la git help add :

-N, --intent-to-add Record only the fact that the path will be added later. An entry for the path is placed in the index with no content. This is useful for, among other things, showing the unstaged content of such files with git diff and committing them with git commit -a.


Editar: esto no parece estar funcionando ahora. Estoy seguro de que fue antes (en git 1.7.1). En caso de que no funcione, sugiero escenificación /dev/null como se sugiere arriba:

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

Si está en Windows (sin /dev/null ), puede reemplazarlo con la ruta a un archivo vacío.

Respuesta original

Usted quiere

git add -p # (or --patch)

Esto agrega archivos sin seguimiento para mí. Desde la página man:

Interactivamente elija trozos de parche entre el índice y el árbol de trabajo y agréguelos al índice. Esto le da al usuario la oportunidad de revisar la diferencia antes de agregar contenido modificado al índice.

Esto ejecuta de manera efectiva add --interactive, pero omite el menú de comando inicial y salta directamente al subcomando de parche. Vea "Modo interactivo" para más detalles.


git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile git add --interactive newfile

Demostración simple:

mkdir /tmp/demo cd /tmp/demo git init . echo hello > newfile git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

  • Sugerencia Si está seguro de que el blob ''vacío'' ya existe en su base de datos de objetos git, podría codificar el hash e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 . No recomiendo hacer eso_
  • Sugerencia Si está en Windows, probablemente solo pueda usar NUL: lugar de /dev/null . De lo contrario, use algo como echo -n '''' | git hash-object --stdin -w echo -n '''' | git hash-object --stdin -w

Ahora el índice contendrá newfile como el blob vacío, y el blob vacío se ha ingresado en la base de datos de objetos si aún no existía:

$ find .git/objects/ -type f .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: newfile # # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: newfile # $ git diff diff --git a/newfile b/newfile index e69de29..ce01362 100644 --- a/newfile +++ b/newfile @@ -0,0 +1 @@ +hello

Esto debería ser exactamente lo que quieres. ¿También puedo recomendar el plugin vim fugitive para una gestión de índices muy inteligente (ver Better git add -p? )