2012-04-04 9 views
17

En git, ¿hay alguna manera (simple) de modificar el índice para que solo se agreguen los cambios a los archivos que ya están en él? Suena algo complicado, pero lo que quiero lograr es simple.Actualizar archivos por etapas

permite decir mi índice se parece a esto (despojado poco git status salida):

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: B 
#  modified: C 
# 
# Untracked files: 
#  D 

Algunos cambios en B están en el índice, algunos no lo son. C no se organiza en absoluto.

¿Cómo puedo actualizar B en el índice (estadifique sus cambios sin instancia) sin agregar C?

I.e. Me gustaría que el índice de aspecto:

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: C 
# 
# Untracked files: 
#  D 

En este caso sencillo que puede, por supuesto, puede lograr con un simple git add B, pero me gustaría saber si hay una respuesta simple para el caso general. Intenté git add --refresh, pero si entiendo correctamente, eso solo actualiza la información de estadísticas.

+0

Se puede mostrar una caso de uso real en el que te gustaría hacer eso? No puedo imaginar ninguno (cuando agrego un archivo y lo modifico más, no significa automáticamente que también quiera agregar esos cambios, especialmente cuando no deseo agregar cambios en otros archivos). –

+0

@JanHudec Probablemente no necesitaría esto si fuera más estricto y tocara solo aquellos archivos que deberían ir en la confirmación ('B'). Sin embargo, a veces me dejo llevar y empiezo a hacer cambios que deberían estar en una nueva confirmación ('C'), así que agregué' B' al índice. Antes de comprometerme, siempre reviso las diferencias y, a veces, limpio algo en 'B'. y es cuando necesito esto. Supongo que probablemente podría ser resuelto de otra manera, por ejemplo con stash – axelarge

+0

Mi punto es que cuando estás haciendo algo en el archivo 'X' que debe ir en commit 'B' y dejarse llevar y hacer los cambios que deberían ir en commit 'C', algunos de esos cambios a menudo vuelven a ser' X'. En ese caso, desea agregar -i trozos individuales manualmente y no solo volver a agregar el archivo 'X'. Obviamente, si te dejas llevar, probablemente hayas notado algo alrededor del punto que estabas cambiando, por lo que es poco probable que los cambios adicionales no toquen los archivos que el puño establece. –

Respuesta

22

El siguiente comando actualizar el índice de contener los otros cambios en B que no ha sido puesta en escena sin embargo:

git update-index --again 
+1

¡Ah, mucho mejor que mi método! – torek

+0

¡Perfecto! Eso es exactamente lo que necesitaba – axelarge

1

No sé de una manera completamente trivial para hacer esto, pero:

git status --porcelain 

mostrará el archivo B (y único B) como el estado "MM", por lo que:

git status --porcelain | grep ^MM | cut -d' ' -f 2 

producirá una lista de dichos archivos.

Sin embargo, no hay ningún problema en "volver a agregar" A.

También puede usar git diff-index --cached --name-status HEAD. (Puede ser que necesite esto si su Git es demasiado viejo para tener git status --porcelain.)

+0

Gracias, no sabía sobre --porcelana para el estado. – axelarge

+0

Actualmente es lo mismo que -s/--short, pero promete seguir siendo analizable por máquina, lo cual es importante si lo incluye en algún script. :-) – torek

+0

Probé el estado 'git --porcelain | grep^[AM] M | cut -d '' -f 2- | xargs git add', pero falla con nombres de archivos que contienen espacios.Supongo que esto podría ser visto como otra pregunta, ¿pero quizás puedas ayudar? Con xargs -0 no funciona en absoluto – axelarge

Cuestiones relacionadas