¿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
9 answers
git add -u
git reset -- main/dontcheckmein.txt
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"
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...
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/*
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.
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/*
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
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
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 --patch
bastante 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.
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í.
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