Git
Ignorando archivos y carpetas
Buscar..
Introducción
Este tema ilustra cómo evitar agregar archivos no deseados (o cambios de archivos) en un repositorio de Git. Hay varias formas (global o local .gitignore
, .git/exclude
, git update-index --assume-unchanged
y git update-index --skip-tree
), pero tenga en cuenta que Git administra el contenido , lo que significa: ignorar en realidad ignora el contenido de una carpeta (es decir, archivos). Una carpeta vacía se ignoraría de forma predeterminada, ya que no se puede agregar de todos modos.
Ignorando archivos y directorios con un archivo .gitignore
Puede hacer que Git ignore ciertos archivos y directorios, es decir, excluirlos de que Git los .gitignore
, mediante la creación de uno o más archivos .gitignore
en su repositorio.
En los proyectos de software, .gitignore
generalmente contiene una lista de archivos y / o directorios que se generan durante el proceso de compilación o en tiempo de ejecución. Las entradas en el archivo .gitignore
pueden incluir nombres o rutas que apuntan a:
- recursos temporales, por ejemplo, cachés, archivos de registro, código compilado, etc.
- Archivos de configuración local que no deben compartirse con otros desarrolladores.
- archivos que contienen información secreta, como contraseñas de inicio de sesión, claves y credenciales
Cuando se crean en el directorio de nivel superior, las reglas se aplicarán recursivamente a todos los archivos y subdirectorios en todo el repositorio. Cuando se crean en un subdirectorio, las reglas se aplicarán a ese directorio específico y sus subdirectorios.
Cuando se ignora un archivo o directorio, no será:
- seguido por Git
- reportado por comandos como
git status
ogit diff
- puesta en escena con comandos como
git add -A
En el caso inusual de que necesite ignorar los archivos rastreados, se debe tener especial cuidado. Ver: Ignorar los archivos que ya se han confirmado en un repositorio Git .
Ejemplos
Aquí hay algunos ejemplos genéricos de reglas en un archivo .gitignore
, basados en patrones de archivos glob :
# Lines starting with `#` are comments.
# Ignore files called 'file.ext'
file.ext
# Comments can't be on the same line as rules!
# The following line ignores files called 'file.ext # not a comment'
file.ext # not a comment
# Ignoring files with full path.
# This matches files in the root directory and subdirectories too.
# i.e. otherfile.ext will be ignored anywhere on the tree.
dir/otherdir/file.ext
otherfile.ext
# Ignoring directories
# Both the directory itself and its contents will be ignored.
bin/
gen/
# Glob pattern can also be used here to ignore paths with certain characters.
# For example, the below rule will match both build/ and Build/
[bB]uild/
# Without the trailing slash, the rule will match a file and/or
# a directory, so the following would ignore both a file named `gen`
# and a directory named `gen`, as well as any contents of that directory
bin
gen
# Ignoring files by extension
# All files with these extensions will be ignored in
# this directory and all its sub-directories.
*.apk
*.class
# It's possible to combine both forms to ignore files with certain
# extensions in certain directories. The following rules would be
# redundant with generic rules defined above.
java/*.apk
gen/*.class
# To ignore files only at the top level directory, but not in its
# subdirectories, prefix the rule with a `/`
/*.apk
/*.class
# To ignore any directories named DirectoryA
# in any depth use ** before DirectoryA
# Do not forget the last /,
# Otherwise it will ignore all files named DirectoryA, rather than directories
**/DirectoryA/
# This would ignore
# DirectoryA/
# DirectoryB/DirectoryA/
# DirectoryC/DirectoryB/DirectoryA/
# It would not ignore a file named DirectoryA, at any level
# To ignore any directory named DirectoryB within a
# directory named DirectoryA with any number of
# directories in between, use ** between the directories
DirectoryA/**/DirectoryB/
# This would ignore
# DirectoryA/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryW/DirectoryB/
# To ignore a set of files, wildcards can be used, as can be seen above.
# A sole '*' will ignore everything in your folder, including your .gitignore file.
# To exclude specific files when using wildcards, negate them.
# So they are excluded from the ignore list:
!.gitignore
# Use the backslash as escape character to ignore files with a hash (#)
# (supported since 1.6.2.1)
\#*#
La .gitignore
archivos .gitignore
son estándar en varios idiomas, así que para comenzar, aquí hay un conjunto de archivos .gitignore
de muestra enumerados por idioma desde el cual se clonan, copian o modifican en su proyecto. Alternativamente, para un proyecto nuevo, puede considerar la generación automática de un archivo de inicio utilizando una herramienta en línea .
Otras formas de .gitignore
.gitignore
archivos .gitignore
están destinados a comprometerse como parte del repositorio. Si desea ignorar ciertos archivos sin confirmar las reglas de ignorar, aquí hay algunas opciones:
- Edite el archivo
.git/info/exclude
(con la misma sintaxis que.gitignore
). Las reglas serán globales en el alcance del repositorio; - Configure un archivo gitignore global que aplicará reglas de ignorar a todos sus repositorios locales:
Además, puede ignorar los cambios locales a los archivos rastreados sin cambiar la configuración global de git con:
-
git update-index --skip-worktree [<file>...]
: para modificaciones locales menores -
git update-index --assume-unchanged [<file>...]
: para archivos listos para producción, no cambiantes en sentido ascendente
Vea más detalles sobre las diferencias entre los últimos indicadores y la documentación del git update-index
para obtener más opciones.
Limpiando archivos ignorados
Puedes usar git clean -X
para limpiar archivos ignorados:
git clean -Xn #display a list of ignored files
git clean -Xf #remove the previously displayed files
Nota: -X
(mayúsculas) limpia solo los archivos ignorados. Utilice -x
(sin mayúsculas) para eliminar también los archivos sin seguimiento.
Vea la documentación de git clean
para más detalles.
Consulte el manual de Git para más detalles.
Excepciones en un archivo .gitignore
Si ignora los archivos utilizando un patrón pero tiene excepciones, prefija un signo de exclamación (!) A la excepción. Por ejemplo:
*.txt
!important.txt
El ejemplo anterior le indica a Git que ignore todos los archivos con la extensión .txt
excepto los archivos llamados important.txt
.
Si el archivo está en una carpeta ignorada, NO puede volver a incluirlo tan fácilmente:
folder/
!folder/*.txt
En este ejemplo, todos los archivos .txt en la carpeta permanecerán ignorados.
La forma correcta es volver a incluir la carpeta en una línea separada, luego ignorar todos los archivos en la folder
con *
, finalmente, volver a incluir el *.txt
en la folder
, como se *.txt
a continuación:
!folder/
folder/*
!folder/*.txt
Nota : para los nombres de archivos que comienzan con un signo de exclamación, agregue dos signos de exclamación o escape con el carácter \
:
!!includethis
\!excludethis
Un archivo .gitignore global
Para que Git ignore ciertos archivos en todos los repositorios, puede crear un .gitignore global con el siguiente comando en su terminal o símbolo del sistema:
$ git config --global core.excludesfile <Path_To_Global_gitignore_file>
Git ahora usará esto además del propio archivo .gitignore de cada repositorio. Las reglas para esto son:
- Si el archivo
.gitignore
local incluye explícitamente un archivo, mientras que el.gitignore
global.gitignore
ignora, el.gitignore
local tiene prioridad (el archivo se incluirá) - Si el repositorio se clona en varias máquinas, entonces
.gigignore
global debe cargarse en todas las máquinas o al menos incluirlo, ya que los archivos ignorados se enviarán al repositorio mientras que la PC con el.gitignore
global no lo actualizaría. . Esta es la razón por la que un.gitignore
específico del.gitignore
es una mejor idea que uno global si un equipo trabaja en el proyecto.
Este archivo es un buen lugar para mantener ignorados específicos de plataformas, máquinas o usuarios, por ejemplo, OSX .DS_Store
, Windows Thumbs.db
o Vim *.ext~
y *.ext.swp
ignoran si no desea mantenerlos en el repositorio . Por lo tanto, un miembro del equipo que trabaja en OS X puede agregar todos los .DS_STORE
y _MACOSX
(que en realidad es inútil), mientras que otro miembro del equipo en Windows puede ignorar todos los thumbs.bd
Ignorar los archivos que ya se han confirmado en un repositorio Git
Si ya ha agregado un archivo a su repositorio Git y ahora desea dejar de rastrearlo (para que no esté presente en futuras confirmaciones), puede eliminarlo del índice:
git rm --cached <file>
Esto eliminará el archivo del repositorio e impedirá que Git rastree otros cambios. La opción --cached
asegurará que el archivo no se elimine físicamente.
Tenga en cuenta que los contenidos agregados previamente del archivo aún serán visibles a través del historial de Git.
Tenga en cuenta que si alguien más extrae del repositorio después de haber eliminado el archivo del índice, su copia se eliminará físicamente .
Puede hacer que Git pretenda que la versión de directorio de trabajo del archivo está actualizada y leer la versión de índice en su lugar (ignorando así los cambios en ella) con el bit " omitir worktree "
git update-index --skip-worktree <file>
La escritura no se ve afectada por este bit, la seguridad del contenido sigue siendo la primera prioridad. Nunca perderás tus preciosos cambios ignorados; por otro lado, este bit entra en conflicto con el ocultamiento: para eliminar este bit, use
git update-index --no-skip-worktree <file>
A veces se recomienda erróneamente mentirle a Git y hacer que asuma que el archivo no se modifica sin examinarlo. A primera vista, considera que ignora cualquier cambio adicional en el archivo, sin eliminarlo de su índice:
git update-index --assume-unchanged <file>
Esto forzará a git a ignorar cualquier cambio realizado en el archivo (tenga en cuenta que si extrae cualquier cambio en este archivo, o si lo guarda, sus cambios ignorados se perderán )
Si desea que git vuelva a "preocuparse" por este archivo, ejecute el siguiente comando:
git update-index --no-assume-unchanged <file>
Comprobando si un archivo es ignorado
El comando git check-ignore
informa sobre los archivos ignorados por Git.
Puede pasar los nombres de archivo en la línea de comandos, y git check-ignore
mostrará los nombres de archivos que se ignoran. Por ejemplo:
$ cat .gitignore
*.o
$ git check-ignore example.o Readme.md
example.o
Aquí, solo los archivos * .o están definidos en .gitignore, por lo que Readme.md no aparece en la salida de git check-ignore
.
Si desea ver la línea de la que .gitignore es responsable de ignorar un archivo, agregue -v al comando git check-ignore:
$ git check-ignore -v example.o Readme.md
.gitignore:1:*.o example.o
Desde Git 1.7.6 en adelante, también puede usar git status --ignored
para ver archivos ignorados. Puede encontrar más información sobre esto en la documentación oficial o en Buscar archivos ignorados por .gitignore .
Ignorar archivos en subcarpetas (múltiples archivos gitignore)
Supongamos que tienes una estructura de repositorio como esta:
examples/
output.log
src/
<files not shown>
output.log
README.md
output.log
en el directorio de ejemplos es válido y es necesario para que el proyecto reúna un entendimiento, mientras que el que está debajo de src/
se crea durante la depuración y no debe estar en el historial o parte del repositorio.
Hay dos formas de ignorar este archivo. Puede colocar una ruta absoluta en el archivo .gitignore
en la raíz del directorio de trabajo:
# /.gitignore
src/output.log
Alternativamente, puede crear un archivo .gitignore
en el directorio src/
e ignorar el archivo relativo a este .gitignore
:
# /src/.gitignore
output.log
Ignorando un archivo en cualquier directorio
Para ignorar un archivo foo.txt
en cualquier directorio, solo debe escribir su nombre:
foo.txt # matches all files 'foo.txt' in any directory
Si desea ignorar el archivo solo en parte del árbol, puede especificar los subdirectorios de un directorio específico con **
patrón:
bar/**/foo.txt # matches all files 'foo.txt' in 'bar' and all subdirectories
O puede crear un archivo .gitignore
en la bar/
directorio. Equivalente al ejemplo anterior sería crear la bar/.gitignore
archivos bar/.gitignore
con estos contenidos:
foo.txt # matches all files 'foo.txt' in any directory under bar/
Ignorar archivos localmente sin cometer reglas de ignorar
.gitignore
ignora los archivos localmente, pero está destinado a comprometerse con el repositorio y compartirse con otros contribuyentes y usuarios. Puede establecer un .gitignore
global, pero luego todos sus repositorios compartirían esa configuración.
Si desea ignorar ciertos archivos en un repositorio localmente y no hacer que el archivo sea parte de ningún repositorio, edite .git/info/exclude
dentro de su repositorio.
Por ejemplo:
# these files are only ignored on this repo
# these rules are not shared with anyone
# as they are personal
gtk_tests.py
gui/gtk/tests/*
localhost
pushReports.py
server/
Plantillas precargadas .gitignore
Si no está seguro de qué reglas incluir en su archivo .gitignore
, o simplemente desea agregar excepciones generalmente aceptadas a su proyecto, puede elegir o generar un archivo .gitignore
:
Muchos servicios de alojamiento como GitHub y BitBucket ofrecen la capacidad de generar archivos .gitignore
basados en los lenguajes de programación e IDE que puede estar usando:
Ignorar los cambios posteriores en un archivo (sin eliminarlo)
A veces desea mantener un archivo en Git pero ignorar los cambios posteriores.
Dígale a Git que ignore los cambios en un archivo o directorio usando update-index
:
git update-index --assume-unchanged my-file.txt
El comando anterior le indica a Git que asuma que my-file.txt
no se ha modificado, y que no debe verificar o informar cambios. El archivo todavía está presente en el repositorio.
Esto puede ser útil para proporcionar valores predeterminados y permitir anulaciones del entorno local, por ejemplo:
# create a file with some values in cat <<EOF MYSQL_USER=app MYSQL_PASSWORD=FIXME_SECRET_PASSWORD EOF > .env # commit to Git git add .env git commit -m "Adding .env template" # ignore future changes to .env git update-index --assume-unchanged .env # update your password vi .env # no changes! git status
Ignorando solo parte de un archivo [stub]
A veces, es posible que desee tener cambios locales en un archivo que no desea confirmar o publicar. Lo ideal es que la configuración local se concentre en un archivo separado que pueda ubicarse en .gitignore
, pero a veces, como solución a corto plazo, puede ser útil tener algo local en un archivo registrado.
Puedes hacer que Git "no vea" esas líneas usando un filtro limpio. Ni siquiera aparecerán en diferencias.
Supongamos que aquí hay un fragmento del archivo file1.c
:
struct settings s;
s.host = "localhost";
s.port = 5653;
s.auth = 1;
s.port = 15653; // NOCOMMIT
s.debug = 1; // NOCOMMIT
s.auth = 0; // NOCOMMIT
No quieres publicar líneas de NOCOMMIT
ningún lugar.
Cree un filtro "nocommit" agregando esto al archivo de configuración de Git como .git/config
:
[filter "nocommit"]
clean=grep -v NOCOMMIT
Agregue (o cree) esto a .git/info/attributes
o .gitmodules
:
file1.c filter=nocommit
Y tus líneas NOCOMMIT están ocultas de Git.
Advertencias:
- El uso de un filtro limpio ralentiza el procesamiento de archivos, especialmente en Windows.
- La línea ignorada puede desaparecer del archivo cuando Git lo actualiza. Puede contrarrestarse con un filtro de manchas, pero es más complicado.
- No probado en Windows
Ignorando los cambios en los archivos rastreados. [talón]
.gitignore y .git/info/exclude
funcionan solo para archivos sin seguimiento.
Para establecer el indicador de ignorar en un archivo seguido, use el comando update-index :
git update-index --skip-worktree myfile.c
Para revertir esto, usa:
git update-index --no-skip-worktree myfile.c
Puede agregar este fragmento de código a su configuración global de git para tener comandos de git hide
, git unhide
y git hidden
más convenientes:
[alias]
hide = update-index --skip-worktree
unhide = update-index --no-skip-worktree
hidden = "!git ls-files -v | grep ^[hsS] | cut -c 3-"
También puede usar la opción --asumir-sin cambios con la función de actualización del índice
git update-index --assume-unchanged <file>
Si desea ver este archivo nuevamente para los cambios, use
git update-index --no-assume-unchanged <file>
Cuando se especifica el indicador "asume-unchanged", el usuario se compromete a no cambiar el archivo y le permite a Git asumir que el archivo del árbol de trabajo coincide con lo que se registra en el índice. por ejemplo, cuando se fusiona en un compromiso; por lo tanto, en caso de que el archivo supuestamente sin seguimiento se modifique en sentido ascendente, deberá manejar la situación manualmente. En este caso, la atención se centra en el rendimiento.
Si bien el indicador --skip-worktree es útil cuando le indica a git que no toque un archivo específico porque el archivo se cambiará localmente y no quiere cometer los cambios accidentalmente (es decir, el archivo de configuración / propiedades configurado para un determinado ambiente). Skip-worktree tiene prioridad sobre asumir-sin cambiar cuando ambos están configurados.
Borrar archivos ya confirmados, pero incluidos en .gitignore
A veces sucede que git rastreaba un archivo, pero en un momento posterior se agregó a .gitignore para dejar de rastrearlo. Es un escenario muy común olvidarse de limpiar estos archivos antes de agregarlos a .gitignore. En este caso, el archivo antiguo aún estará en el repositorio.
Para solucionar este problema, uno podría realizar una eliminación "en seco" de todo en el repositorio, seguido de volver a agregar todos los archivos. Mientras no tenga cambios pendientes y se --cached
parámetro --cached
, este comando es bastante seguro de ejecutar:
# Remove everything from the index (the files will stay in the file system)
$ git rm -r --cached .
# Re-add everything (they'll be added in the current state, changes included)
$ git add .
# Commit, if anything changed. You should see only deletions
$ git commit -m 'Remove all files that are in the .gitignore'
# Update the remote
$ git push origin master
Crear una carpeta vacía
No es posible agregar y confirmar una carpeta vacía en Git debido a que Git administra los archivos y adjunta su directorio a ellos, lo que reduce las confirmaciones y mejora la velocidad. Para solucionar esto, hay dos métodos:
Método uno: .gitkeep
Un truco para .gitkeep
esto es usar un archivo .gitkeep
para registrar la carpeta de Git. Para hacer esto, simplemente cree el directorio requerido y agregue un archivo .gitkeep
a la carpeta. Este archivo está en blanco y no sirve para otro propósito que no sea simplemente registrar la carpeta. Para hacer esto en Windows (que tiene extrañas convenciones de nomenclatura de archivos) simplemente abra git bash en el directorio y ejecute el comando:
$ touch .gitkeep
Este comando solo .gitkeep
archivo .gitkeep
en blanco en el directorio actual
Método dos: dummy.txt
Otro truco para esto es muy similar al anterior y se pueden seguir los mismos pasos, pero en lugar de un .gitkeep
, solo usa un dummy.txt
en dummy.txt
lugar. Esto tiene la ventaja adicional de poder crearlo fácilmente en Windows usando el menú contextual. Y también puedes dejar mensajes graciosos en ellos. También puedes usar el archivo .gitkeep
para rastrear el directorio vacío. .gitkeep
normalmente es un archivo vacío que se agrega para rastrear el directoy vacío.
Buscando archivos ignorados por .gitignore
Puede listar todos los archivos ignorados por git en el directorio actual con el comando:
git status --ignored
Así que si tenemos una estructura de repositorio como esta:
.git
.gitignore
./example_1
./dir/example_2
./example_2
... y .gitignore archivo que contiene:
example_2
... que el resultado del comando será:
$ git status --ignored
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
.example_1
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
dir/
example_2
Si desea enumerar los archivos ignorados recursivamente en los directorios, tiene que usar un parámetro adicional - --untracked-files=all
El resultado se verá así:
$ git status --ignored --untracked-files=all
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
example_1
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
dir/example_2
example_2