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


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 que pueda hacer git add pero simplemente ignorar el único archivo de texto que no quiero tocar? Algo como:

git add -u -except main/dontcheckmein.txt
 402
Author: Scott Weldon, 2010-12-18

9 answers

git add -u
git reset -- main/dontcheckmein.txt
 607
Author: Ben Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-17 23:00:00

1) Para empezar a ignorar los cambios en un único archivo ya versionado

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

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

Marque aquí

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

Primero mira esto Git global ignore 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 es también en MyProject), en .gitignore pones solo esto MyFolder/myfile.txt

Puede confirmar qué regla está relacionada con 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 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 ...

Así que, por ahora, creo que lo mejor es hacer algún script para mezclar su .gitignore con ~/.gitignore_global en .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...

 93
Author: Aquarius Power,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48

Para un Archivo

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

Para una carpeta

git add -u
git reset -- main/*
 51
Author: Rituraj ratan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-14 11:24:27

Si bien Ben Jackson es correcto, pensé que añadiría cómo he estado usando esa solución tambié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 how .gitignore works).

#!/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 al implementar. Este proyecto depende de SherlockActionBar, por lo que necesita ser referenciado en el proyecto.propiedades, pero eso interfiere con la compilación, así que ahora solo escribo gitadd y añado todos los cambios a git sin tener que quitar el proyecto.propiedades cada vez.

 19
Author: Anthony Naddeo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-14 01:18:29

Ahora git soporta exclude certain paths and files por pathspec magic :(exclude) y su forma corta :!. Así que usted puede lograr fácilmente como el siguiente comando.

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

En realidad se puede especificar más:

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
 5
Author: cateyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-19 03:21:26

Prueba esto:

Git checkout main main/dontcheckmein.txt

 3
Author: Abz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-08 16:13:24

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
 1
Author: Dhanuka Nuwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-28 19:05:30

Utilizo git add --patchbastante y quería algo como esto para evitar tener que golpear d todo el tiempo a través de los mismos archivos. Preparé un par de alias de git 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_PATTERN para un caso de uso más general.

 0
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 06:01:57

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

git add *.c

From git-scm (or / and man git add):

Git add ...

Archivos desde los que añadir contenido. Fileglobs (por ejemplo,*.c) se puede dar para añadir 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 son ignorado) que se encuentran en la carpeta main. Usted puede incluso ir salvaje con patrones más elaborados:

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

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

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

git add *.c *.h

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

Lo encuentro particularmente útil cuando estoy haciendo muchos cambios, pero aún así quiero que mis confirmaciones se mantengan atómicas y reflejen un proceso gradual en lugar de una mezcolanza de cambios que pueda 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 solo los archivos que necesito con un patrón simple y excluir todo lo demás.

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

 0
Author: cegas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-13 06:11:23