2010-12-17 13 views
342

Tengo un montón de archivos en un conjunto de cambios, pero quiero ignorar específicamente un solo archivo modificado. Parece que esto después de git status:¿Agregar todos los archivos a una confirmación excepto un solo archivo?

# modified: main/dontcheckmein.txt 
# deleted: main/plzcheckmein.c 
# deleted: main/plzcheckmein2.c 
... 

¿Hay una manera que puedo hacer git add pero simplemente ignorar el archivo de un texto que no quiero tocar? Algo así como:

git add -u -except main/dontcheckmein.txt 

Respuesta

510
git add -u 
git reset -- main/dontcheckmein.txt 
+18

¿cómo excluyo toda la carpeta? - principal o principal/o principal/*? –

+1

@MariusKavansky Puede usar todos estos formularios. Si usa 'main/*', es necesario agregar '--' delante para que Git sepa que se trata de una ruta. Las otras dos variantes funcionan sin incluir los dos guiones. (Probado en el símbolo del sistema en Windows 7 con msysGit) – dennisschagt

+2

Si tiene algunas carpetas que desea excluir que contienen una gran cantidad de archivos u otras carpetas: agréguelas temporalmente a su gitignore. realizar un '' 'git reset''' para esas carpetas luego seguirá funcionando, pero tomará bastante tiempo para agregar las carpetas grandes. –

17

Mientras Ben Jackson es correcta, pensé que iba a añadir la forma en que he estado usando esa solución también. A continuación se muestra un script muy simple que uso (que llamo gitadd) para agregar todos los cambios excepto unos pocos que sigo listados en un archivo llamado .gittrackignore (muy similar a cómo funciona .gitignore).

#!/bin/bash 
set -e 

git add -A 
git reset `cat .gittrackignore` 

Y esto es lo que mi actual .gittrackignore se parece.

project.properties 

Estoy trabajando en un proyecto de Android que compilo desde la línea de comandos durante la implementación. Este proyecto depende de SherlockActionBar, por lo que debe estar referenciado en project.properties, pero eso complica la compilación, así que ahora solo escribo gitadd y agrego todos los cambios a git sin tener que quitar project.properties cada vez .

+0

¿No te falta ese '--' de tu comando? –

+0

No sabía lo que '- 'era hasta su comentario. De acuerdo con las páginas man, es opcional y no cambia el resultado del comando (al menos en este caso). Esta pregunta parece apoyar eso, http://stackoverflow.com/questions/17800994/git-two-dashes-means-with-no-more-options. Corrígeme si me equivoco, pero parece que significa "tratar cualquier cosa después de' --' como argumentos, no opciones/interruptores " –

+0

Buen uso de' --' en 'git checkout' Veo en esa pregunta . No sabía lo que era la doble carrera hasta este intercambio nuestro también. Me pregunto si la ambigüedad 'git checkout' entre las ramas y los archivos podría afectar, en esta o en otra forma,' git reset' también. –

83

1) Para empezar haciendo caso omiso de cambios en un único archivo ya versionado

git update-index --assume-unchanged "main/dontcheckmein.txt" 

y para deshacer ese git update-index --no-assume-unchanged "main/dontcheckmein.txt"

check here

2) ignorar por completo una sola fila específica la prevención desde que se creó en el repositorio

primer vistazo a este Git global ignore not working

y al .gitignore añadir la ruta relativa al archivo sin llevar ./

por lo que si el archivo está en MyProject/MyFolder/myfile.txt (donde .git es también en MyProject), en .gitignore se pone sólo por esta MyFolder/myfile.txt

puede confirmar qué regla se relaciona con el ignorar con git check-ignore "MyFolder/myfile.txt"

Acerca de Global ignore

Ese enlace habla de ~/.gitignore_global; pero el archivo está relacionado con tu proyecto; Por lo tanto, si se pone el patrón MyFolder/myfile.txt excluye a ~/.gitignore_global, va a trabajar, pero no tiene mucho sentido ...

En el otro lado, si la configuración de su proyecto con git config core.excludesfile .gitignore donde .gitignore está en MyProject; esa configuración anulará ~/.gitignore_global que puede tener very useful rules ...

Así que, por ahora, creo que lo mejor es hacer una secuencia de comandos para mezclar su .gitignore con ~/.gitignore_global en .

Una última advertencia
Si el archivo que desea ignorar ya está en el repositorio, este método no funcionará a menos que hagas esto: git rm "MyFolder/myfile.txt", pero la copia de seguridad en primer lugar, ya que se eliminará de forma local también! puede copiar de nuevo más tarde ...

+3

Puede usar 'git rm --cached MyFolder/myyfile.txt' para eliminar el archivo del repositorio pero mantenerlo localmente. [Explicación en help.github.com] (https://help.github.com/articles/ignoring-files/) – dennisschagt

35

para un archivo

git add -u 
git reset -- main/dontcheckmein.txt 

Para una carpeta

git add -u 
git reset -- main/* 
0

utilizo git add --patch un poco y quería algo como esto para evitar tener que pulsar d todo el tiempo a través de los mismos archivos. Saqué un par poco limpia de alias git para realizar el trabajo:

[alias] 
    HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ([[ \"$1\" ]] && egrep -v \"$1\" || cat); }; f" 
    ap      = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST')" 

En mi caso, yo sólo quería hacer caso omiso de ciertos archivos minified todo el tiempo, pero se puede hacer que use una variable de entorno como $GIT_EXCLUDE_PATTERN para un caso de uso más general.

2

Prueba esto:

git checkout - principal/dontcheckmein.txt

0

Para el caso específico de la cuestión, esto añadiría todos los archivos con la extensión .c y dejar de lado todo lo demás:

git add *.c 

De git-scm (o/y man git add):

git add <pathspec> ...

Archivos para añadir contenidos de. Fileglobs (por ejemplo, * .c) se puede dar para agregar todos los archivos coincidentes. < ...>

Tenga en cuenta que esto significa que también se podría hacer algo como:

git add **/main/* 

para añadir todos los archivos (que no son ignorados) que se encuentran en la carpeta main. Incluso puede ir salvaje con algo como esto:

git add **/s?c/*Service* 

para añadir todos los archivos que están en carpeta y s(any char)c tener Service en algún lugar de su nombre. Este link podría darle algunas ideas de patrones glob.

Me resulta especialmente útil cuando realizo muchos cambios, pero aún así quiero que mis compromisos se mantengan atómicos y reflejen el proceso gradual en lugar de una cobertura de cambios que pueda estar trabajando en ese momento.Por supuesto, en algún momento el costo de generar patrones elaborados supera el costo de simplemente agregar archivos con métodos más simples.

Por cierto, usted puede necesita citar sus patrones globales para que funcionen, pero este nunca fue el caso para mí.

Cuestiones relacionadas