ver tipos tag modificados log etiquetas crear cambios archivos archivo git git-add

git - tipos - ¿Agregar todos los archivos a un commit excepto un solo archivo?



tipos de etiquetas en git (10)

Ahora git admite exclude certain paths and files mediante pathspec magic :(exclude) y su forma corta:! . Así que puedes lograrlo fácilmente como el siguiente comando.

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

En realidad se puede 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/*

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 git status :

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

¿Hay alguna manera de hacer git add pero simplemente ignorar el archivo de texto que no quiero tocar? Algo como:

git add -u -except main/dontcheckmein.txt


Cambios que se deben confirmar: (use "git reset HEAD ..." para anular el escenario)


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

git add *.c

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

git añadir <pathspec> ...

Archivos para agregar contenido de. Se pueden dar fileglobs (por ejemplo, * .c) 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 carpeta main . Incluso puedes enloquecer con patrones más elaborados:

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

Lo anterior agregará todos los archivos que están en s(any char)c carpeta s(any char)c y tienen Service en algún lugar de su nombre de archivo.

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

git add *.c *.h

Este link podría darte más ideas de patrones globales.

Me resulta particularmente útil cuando estoy realizando muchos cambios, pero aún quiero que mis compromisos sean atómicos y reflejen un proceso gradual en lugar de un montón 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 deba citar sus patrones globales para que funcionen, pero este nunca fue el caso para mí.


Prueba esto:

git checkout - main / dontcheckmein.txt


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 unos pocos seleccionados que sigo enumerando 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 como se ve mi actual .gittrackignore .

project.properties

Estoy trabajando en un proyecto de Android que compilo desde la línea de comandos cuando lo implemento. Este proyecto depende de SherlockActionBar, por lo que necesita ser referenciado en project.properties, pero eso confunde con la compilación, así que ahora solo gitadd y agrego todos los cambios a git sin tener que des-agregar project.properties cada vez. .


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

Ejemplo

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


Uso git add --patch bastante y quería algo como esto para evitar tener que golpear d todo el tiempo a través de los mismos archivos. Saqué un par de alias git muy piratas 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 quise ignorar ciertos archivos minificados todo el tiempo, pero podría hacer que use una variable de entorno como $GIT_EXCLUDE_PATTERN para un caso de uso más general.


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

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

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

Chequea aquí

2) Ignorar completamente un único archivo específico que impide que se cree en el repositorio

Primer vistazo a este Git global ignorar no funciona

y en .gitignore agregue la ruta relativa al archivo sin encabezar ./

así que si su archivo está en MyProject/MyFolder/myfile.txt (donde .git también está en MyProject ), en .gitignore solo coloque este MyFolder/myfile.txt

puede confirmar qué regla está relacionada con la omisión con git check-ignore "MyFolder/myfile.txt"

Acerca de ignorar global

Ese enlace habla sobre ~/.gitignore_global ; pero el archivo está relacionado con su proyecto; entonces, si pones el patrón de exclusión MyFolder/myfile.txt en ~/.gitignore_global , funcionará pero no tendrá mucho sentido ...

Por otro lado, si configura su proyecto con git config core.excludesfile .gitignore donde .gitignore está en MyProject ; esa configuración anulará ~/.gitignore_global que puede tener reglas muy útiles ...

Entonces, por ahora, creo que lo mejor es crear un script para mezclar tu .gitignore con ~/.gitignore_global en .gitignore .

Una ultima 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 primero haga una copia de seguridad ya que se eliminará localmente! Puedes copiarlo de nuevo más tarde ...


Para un archivo

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

Para una carpeta

git add -u git reset -- main/*


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