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 comoecho -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? )