¿Agregar todos los archivos a una confirmación excepto un solo archivo?


571

Tengo un montón de archivos en un conjunto de cambios, pero quiero ignorar específicamente un solo archivo modificado. Se ve así después de git status:

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

¿Hay alguna manera de hacerlo git addpero simplemente ignorar el único archivo de texto que no quiero tocar? Algo como:

git add -u -except main/dontcheckmein.txt

Respuestas:


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

28
¿Cómo excluyo toda la carpeta? - principal o principal / o principal / *?
Alan Coromano

8
@MariusKavansky Puede usar todos estos formularios. Si lo usa main/*, es necesario agregarlo --delante para que git sepa que es un camino. 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 una git resetpara esas carpetas después seguirá funcionando, pero le tomará mucho tiempo agregar las carpetas grandes.
Michael Trouw

2
Entonces, ¿no hay una sola línea?
BroVic

55
@Ben Jackson sería bueno comentar cada línea, ¿no crees?
ed1nh0

140

1) Para comenzar a ignorar los cambios en un solo archivo ya versionado

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

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

documentos de github para ignorar archivos

2) Para ignorar por completo un archivo único específico que impide que se cree en el repositorio

Primero, mira esta publicación de stackoverflow: Git global ignore no funciona

En .gitignore, agregue la ruta relativa al archivo sin guiar./ .

Entonces, si su archivo está en MyProject/MyFolder/myfile.txt, (donde .gittambién está en elMyProject carpeta), agréguelo MyFolder/myfile.txta.gitignore archivo .

Puede confirmar qué reglas están asociadas con ignorar a través de git check-ignore "MyFolder/myfile.txt"

Sobre ignorar global

Ese enlace habla ~/.gitignore_global, pero el archivo está relacionado con su proyecto. Entonces, si pones el patrón de exclusión MyFolder/myfile.txten~/.gitignore_global , va a trabajar, pero no tendrá mucho sentido ...

Por otro lado, si configura su proyecto con git config core.excludesfile .gitignoredónde .gitignoreestá MyProject, el archivo local se anulará ~/.gitignore_global, lo que puede tener reglas muy útiles. ...

Entonces, por ahora, creo que es mejor hacer un script para mezclarlo .gitignorecon ~/.gitignore_globalat .gitignore.

Una última advertencia
Si el archivo que desea ignorar ya está en el repositorio, este método no funcionará a menos que haga esto: ¡ git rm "MyFolder/myfile.txt"pero haga una copia de seguridad primero, ya que también se eliminará localmente! Puedes copiarlo más tarde ...


55
Puede usar git rm --cached MyFolder/myyfile.txtpara eliminar el archivo del repositorio pero mantenerlo localmente. Explicación en help.github.com
dennisschagt

87

Para un archivo

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

Para una carpeta

git add -u
git reset -- main/*

99
¿Por qué es necesario el -u? ¿por qué no git add . && git reset -- main/*?

2
La opción -u actualiza el índice justo donde ya tiene una entrada que coincide con <pathspec>. Esto elimina y modifica las entradas de índice para que coincidan con el árbol de trabajo, pero no agrega archivos nuevos. Si no se proporciona <pathspec> cuando se usa la opción -u, todos los archivos rastreados en todo el árbol de trabajo se actualizan (las versiones antiguas de Git se usan para limitar la actualización al directorio actual y sus subdirectorios).
Farhad Mammadli

66
¿Alguien puede explicar por qué el -u es necesario en un lenguaje que los profesionales no git entiendan?
Patrick

2
-u se usa para hacer referencia a tu rama actual a la que estás presionando. Ya no necesitará escribir git push origin mastersu próximo impulso, solo git pushy git sabrá que está en la rama maestra. Espero eso ayude.
Pepeng Hapon

69

Ahora es gitcompatible exclude certain paths and filescon la magia del camino :(exclude)y su forma corta :!. Para que pueda lograrlo fácilmente con el siguiente comando.

git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt

En realidad puedes especificar más:

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*

1
La mejor respuesta, gracias! Al menos, para mi caso: solo necesitaba excluir un tipo de archivo.
Andre Polykanine

15
¡Esto es excelente! Tenga en cuenta que en Linux, debe citar las :!...cláusulas para evitar que el shell se queje. Así, por ejemplo: git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*'.
Martin_W

¿Hay algo como eso :!/path/to/(file1|file2)?
seeker_of_bacon

Esto choca con algo en zsh, no funciona para mí en macOS y el último git.
Merlín

1
¿Alguien puede señalar dónde está esto documentado oficialmente?
samurai_jane

20

Si bien Ben Jackson tiene razón, pensé que agregaría también cómo he estado usando esa solución. A continuación se muestra un script muy simple que uso (al que llamo gitadd) para agregar todos los cambios, excepto algunos seleccionados que mantengo 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 así es .gittrackignorecomo se ve mi actual .

project.properties

Estoy trabajando en un proyecto de Android que compilo desde la línea de comandos al implementar. Este proyecto depende de SherlockActionBar, por lo que debe ser referenciado en project.properties, pero eso se mete con la compilación, por lo que ahora solo escribo gitaddy agrego todos los cambios a git sin tener que quitar project.properties cada vez.


No supe qué --era hasta tu comentario. Según las páginas del manual, es opcional y no cambia el resultado del comando (al menos en este caso). Esta pregunta parece apoyar eso, stackoverflow.com/questions/17800994/… . Corrígeme si me equivoco, pero parece que significa "tratar cualquier cosa después --como argumentos, no como opciones / cambios"
Anthony Naddeo

Buen uso de --en git checkoutveo en esa pregunta. No sabía cuál era el doble guión hasta este intercambio nuestro también. Me pregunto si la git checkoutambigüedad entre ramas y archivos podría afectar, en esta o en una forma diferente, git resettambién.
Giulio Piancastelli

10

Para mantener el cambio en el archivo pero no para confirmar, hice esto

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

para verificar que el archivo está excluido

git status


4

Use git add -Apara agregar todos los archivos modificados y recién agregados a la vez.

Ejemplo

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



1

Para el caso específico de la pregunta, la forma más fácil sería agregar todos los archivos con extensión .c y omitir todo lo demás:

git add *.c

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

git add <pathspec> ...

Archivos para agregar contenido. Fileglobs (por ejemplo, * .c) se puede asignar para agregar todos los archivos coincidentes. <...>

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

git add **/main/*

para agregar todos los archivos (que no se ignoran) que están en la maincarpeta. Incluso puedes enloquecer con patrones más elaborados:

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

Lo anterior agregará todos los archivos que están en la s(any char)ccarpeta y tienen Servicealgún lugar en su nombre de archivo.

Obviamente, no está limitado a un patrón por comando. Es decir, puede pedirle a git que agregue todos los archivos que tengan una extensión de .c y .h :

git add *.c *.h

Este enlace puede darle algunas ideas más de patrones globales.

Me resulta particularmente útil cuando estoy haciendo muchos cambios, pero todavía quiero que mis compromisos se mantengan atómicos y reflejen un proceso gradual en lugar de una mezcolanza de cambios en los que puedo estar trabajando en ese momento. Por supuesto, en algún momento el costo de crear patrones elaborados supera el costo de agregar archivos con métodos más simples, o incluso un archivo a la vez. Sin embargo, la mayoría de las veces puedo identificar fácilmente los archivos que necesito con un patrón simple y excluir todo lo demás.

Por cierto, es posible que necesite citar sus patrones globales para que funcionen, pero este nunca fue el caso para mí.


0

Utilizo git add --patchbastante y quería algo como esto para evitar tener que golpear dtodo el tiempo a través de los mismos archivos. Creé un par de alias git muy extravagantes para hacer 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, solo quería ignorar ciertos archivos minificados todo el tiempo, pero podría hacer que use una variable de entorno como $GIT_EXCLUDE_PATTERNpara un caso de uso más general.



0

Puedes probar esto: git add * && git reset main/dontcheckmein.txt

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.