-
Notifications
You must be signed in to change notification settings - Fork 5
Excluir ficheros del proyecto (3)
##Excluir ficheros del repositorio (Parte 3).
Vimos en la primera y segunda parte cómo podíamos configurar Git para que excluyera ciertos ficheros de nuestro repositorio.
En esta tercera parte vamos a ver en qué orden se aplican las distintas opciones y algunos ejemplos prácticos de todo lo visto hasta ahora.
###Prioridad de las opciones.
Cada vez que Git va a comprobar los patrones gitignore
, usará este orden:
-
Patrón proporcionado en la línea de comandos si el comando actual los soporta. (Como git ls-files o git read-tree)
-
Patrones leídos de los ficheros
.gitignore
existentes en las carpetas del proyecto.
2.1. Tiene preferencia el de mayor profundidad. Es decir, el último en la ruta de directorios.
2.2. Dentro de un mismo fichero, tienen preferencia los últimos patrones. Es decir, los que estén en las últimas líneas.
-
Patrones de
$GIT_DIR/info/exclude
. -
Patrones leídos del fichero especificado en la variable de configuración
core.excludesfile
(gitignore_global
).
###Ejemplos prácticos.
-
Tenemos un fichero de configuración de nuestra aplicación que incluye las contraseñas de la base de datos. No queremos subir las contraseñas al repositorio pero sí queremos que los usuarios tengan ese archivo como referencia.
En estos casos, la mejor solución no suele estar relacionada únicamente con Git.
La solución más extendida es crear un fichero de configuración de ejemplo. Por ejemplo:
app.config.sample
.Incluimos ese fichero en el repositorio y añadimos el fichero real
app.config
al fichero.gitignore
.De ese modo cada usuario puede renombrar el fichero de ejemplo y añadir su propia configuración.
Podríamos usar el fichero
exclude
y la opciónassume-unchanged
. Pero tiene la dificultad de que un usuario por descuido o porque no conozca mucho Git, no configure esas opciones en su repositorio local y suba sus contraseñas sin ser consciente de ello.
Por ejemplo, en los proyectos de Laravel, se excluye el archivo .env utilizando el fichero .gitignore
.
- Fichero
.gitignore
habitual para Laravel.
# Ide Helper
_ide_helper.php
# Laravel
/vendor
/node_modules
.env
# Composer
composer.phar
#composer.lock
# Laravel4
/bootstrap/compiled.php
/log/*
.env.*.php
.env.php
-
Añadir un directorio pero no los ficheros que contiene. (Por ejemplo, el directorio
storage/framework/cache
).-
Primero creamos un fichero
.gitignore
o.gitkeep
en la carpeta con el comandotouch /storage/framework/cache/.gitignore
otouch /storage/framework/cache/.gitkeep
. -
A continuación añadimos ese fichero al repositorio Git con
git add storage/framework/cache/.gitignore
(o .gitkeep). -
Y por último, para excluir los ficheros del directorio, añadimos en el fichero
.gitignore
de la raíz del repositorio la siguiente línea:
-
/storage/framework/cache
<br>
El segundo paso es un truco para que funcione nuestra regla. Porque la línea `/storage/framework/cache` exclude también el fichero `.gitignore` o `.gitkeep` que hemos creado. Sin embargo, como lo hemos añadido al repositorio, Git seguirá versionando ese fichero.
Ese es el sistema que utiliza, por ejemplo, Ruby On Rails. Otro sistema más sencillo es crear el fichero `/storage/framework/cache/.gitignore` con este contenido:
!.gitignore
Y añadir ese fichero al repositorio Git con `git add storage/framework/cache/.gitignore`.
En este caso, le decimos primero que ignore todos los archivos de ese directorio, pero en la siguiente línea que tiene prioridad respecto a la primera, le decimos que 'incluya' o 'no ignore' el fichero `.gitignore`.
De hecho, si miráis en los directorios de cualquier proyecto Laravel, veréis que efectivamente existe ese fichero con ese contenido.
<br>
<br>
- En los repositorios de GitHub, suelo subir el fichero LICENSE y el fichero README.md. De ambos ficheros subo la primera versión y no vuelvo a modificarlos. De modo que no quiero tenerlos en local en mis repositorios clonados, pero sí quiero que permanezcan en el repositorio y otros usuarios los bajen al clonarlo.
Si los añado al `.gitignore`, se borrarían del repositorio y además no estarían disponibles para los demás usuarios. Así que los añado al fichero `info/exclude`. Pero cuando los borro, no puedo hacer commit de ese cambio porque sino, igualmente se borrarían del repositorio.
La solución completa es:
Añadis al fichero `$GIT_DIR/info/exclude`:
LICENSE README.md
Y ejecutar los comandos: `git update-index --assume-unchanged LICENSE` y `git update-index --assume-unchanged README.md`
De ese modo, no tengo que volver a preocuparme de esos ficheros y puedo borrarlos de mi directorio local.
<br>
<br>
- Un `.gitignore` habitual en Mac:
.DS_Store Thumbs.db .Trashes ._* Icon .AppleDouble .LSOverride
<br>
<br>
- Si los desarrolladores del proyecto usan distintos sistemas operativos, los ficheros temporales generados por cada sistema operativo, los puede configurar cada usuario a nivel local en el fichero `$GIT_DIR/info/exclude` si son específicos de ese repositorio o en su fichero `.gitignore` global si suelen aparecer en varios repositorios.
<br>
<br>
- Hoy en día muchos editores de programación guardan su configuración en la carpeta del proyecto. Si subimos esa carpeta al repositorio y los demás usuarios se la bajan y usan el mismo editor, sobrescribiremos su configuración. En ese caso, si es un proyecto Open Source en el que hay muchísimos desarrolladores, incluimos los ficheros generados por el editor en nuestro fichero local `exclude` o `gitignore_global`. Si es un proyecto pequeño y todos usan el mismo editor o sólo dos o tres editores distintos, podemos usar el fichero `.gitignore`.
Por ejemplo, para algunos editores habituales:
/.idea/
/nbproject/
#sublime files .sublime-
#vim [.]*.s[a-w][a-z] [.]s[a-w][a-z] *.un~ Session.vim .netrwhist *~
#Atom Editor storage compile-cache dev .npm .node-gyp
#Emacs Editor
*~ #*# /.emacs.desktop /.emacs.desktop.lock .elc auto-save-list tramp .#
Para programadores de Java que usan Eclipse o IntelliJ, un `.gitignore` suele incluir estas líneas:
.classpath .project .settings/
.idea/ *.iml *.iws
.DS_Store
log/ target/
<br>
<br>
- Aquí tenéis ejemplos de ficheros `.gitignore` más complejos:
Laravel: https://gist.github.com/chrisbjr/2ae6f497c86720eb8f40
Eclipse: https://github.com/github/gitignore/blob/master/Global/Eclipse.gitignore
MediaWiki: https://gist.github.com/boyvanamstel/1001987
Desarrollo de Temas en WordPress: https://gist.github.com/ryanscherler/5120024
Desarrollo de Temas en WordPress: https://gist.github.com/calebbrewer/5658868
Proyectos WordPress: https://gist.github.com/ryanscherler/9045010
###Más información.
[GitIgnore.Io - Para generar ficheros .gitignore](https://www.gitignore.io/)
[gitignore en la documentación de git (En inglés)](http://git-scm.com/docs/gitignore)