2011-08-26 10 views
8

A menudo tengo una situación en la que tengo git add ed un conjunto de archivos para una confirmación, pero luego tengo que hacer una modificación a esos archivos para terminar con las modificaciones en esos mismos archivos en Changed but not updated.git volver a agregar solo los archivos que ya han sido montados

¿Hay un trazador de líneas que puedo ejecutar a git add solamente los archivos que existen en Changed but not updated y Changes to be committed listas?

markdsievers$git status 
# On branch master 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# 
# 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: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# modified: src/com/foobar/FooBar.java 

Para el ejemplo anterior sólo quiero Foo.java y Bar.java pero no FooBar.java añadido a la lista Changes to be committed:.

+0

¿Estás pensando en algo más que 'git add -u'? –

+0

'git add -u' parece querer un patrón de archivo; de lo contrario, usa' .' que añadiría 'Foobar.java'. Sí, podría agregar un patrón de archivo para obtener mi ejemplo artificial y eso funcionaría, pero los cambios raramente son tan simples como para que funcione un solo patrón de archivo. – markdsievers

Respuesta

4

Esta es una manera:

git add -u $(git status --porcelain | grep ^MM | cut -d ' ' -f 2) 
+0

Hola, gracias por esto. No sabía sobre '--porcelain'. No pensé que esta fuera una característica irracional de Git, pero quizás es mi flujo de trabajo el que necesita ajustarse. – markdsievers

+0

Esto no funcionó para mí ... Intenta agregar archivos que están modificados pero que aún no están organizados. – Darien

+0

+1! Pero solo funciona en el directorio raíz de git, y usando 'git status -s' en su lugar, funcionará en cualquier directorio. – pktangyue

0

La respuesta aceptada no funcionará si los nombres de archivo contienen un espacio. Además, es inútil este caso, pero agregará todos los archivos sin estado si no hay archivos que estén en las listas Changed but not updated y Changes to be committed. Use esto en su lugar:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^MM(.*)$/') 

Esto solo funcionará para los archivos que solo se cambian. Si quieres que esto funcione para los archivos que se han eliminado, añadido renombrado o copiado, así, utilizar esto:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^[MADRC][MD](.*)$/') 

Pero tenga cuidado con el último. Por ejemplo, si el archivo se agrega en el índice, pero su eliminación no está configurada, la ejecución de este comando también eliminará el archivo en el índice, lo que hará que pierda el contenido de ese archivo.

Tenga en cuenta que ambos funcionarán solo desde el directorio raíz de su git repo.

Cuestiones relacionadas