12 - Evitar que Git siga a ciertos archivos y directorios.

Hay muchas situaciones que por el tipo de archivo no queremos que Git los siga y almacene en la base de datos git (.git directory)

Para especificar que Git ignore el seguimiento de un archivo debemos crear un archivo en la raíz del proyecto con el nombre (.gitignore)

Dentro de este archivo debemos especificar que archivos no debe procesar Git.

Los casos más comunes donde debemos especificar archivos y o carpetas a ignorar son:

  • Los archivos compilados, por ejemplo en Java cuando se compila un archivo con extensión .java se genera un archivo .class, por eficiencia es conveniente que no guardemos en el repositorio de git los archivos .class, ya que los mismos se pueden generar compilando los archivos .java
  • El directorio bin de un proyecto por lo general guardan los archivos compilados, .exe y otros archivos intermedios.
  • El directorio tmp donde se almacenan archivos temporales.
  • El directorio node_modules en proyectos node.

Ejemplo con archivo .gitignore

Vamos a crear un proyecto llamado 'proyecto3' con dos archivos con código fuente de Java. Seguidamente vamos a crear un repositorio de Git para el proyecto. Compilamos los archivos java. Para evitar la carga en el repositorio de los archivos compilados (.class) creamos un archivo llamado (.gitignore) y mediante la sintaxis *.class evitamos que Git incorpore al repositorio cualquier archivo con dicha extensión.

.gitignore

El mensaje nos muestra que se incorporaron en el repositorio 3 archivos:

Aplicacion.java
Persona.java
.gitignore

Tener en cuenta que se carga en el repositorio el archivo .gitignore, pero nos los archivos especificados dentro de dicho archivo.

Otros ejemplos de patrones para indicar archivos a no seguir

No seguir todos los archivos que finalicen con alguna vocal:

*.[aeiouAEIOU]

Ignorar el archivo claves.txt localizado en la raíz del proyecto:

/clave.txt

Ignorar el archivo claves.txt localizado en la la carpeta /claves:

claves/clave.txt

Ignorar todos los archivos de la carpeta documentacion:

documentacion/

Como ejemplo de proyectos reales podemos ver el archivo .gitignore del proyecto Git:

/fuzz_corpora
/GIT-BUILD-DIR
/GIT-BUILD-OPTIONS
/GIT-CFLAGS
/GIT-LDFLAGS
/GIT-PREFIX
/GIT-PERL-DEFINES
/GIT-PERL-HEADER
/GIT-PYTHON-VARS
/GIT-SCRIPT-DEFINES
/GIT-SPATCH-DEFINES
/GIT-USER-AGENT
/GIT-VERSION-FILE
/bin-wrappers/
/git
/git-add
/git-add--interactive
/git-am
/git-annotate
/git-apply
/git-archimport
/git-archive
/git-bisect
/git-blame
/git-branch
/git-bugreport
/git-bundle
/git-cat-file
/git-check-attr
/git-check-ignore
/git-check-mailmap
/git-check-ref-format
/git-checkout
/git-checkout--worker
/git-checkout-index
/git-cherry
/git-cherry-pick
/git-clean
/git-clone
/git-column
/git-commit
/git-commit-graph
/git-commit-tree
/git-config
/git-count-objects
/git-credential
/git-credential-cache
/git-credential-cache--daemon
/git-credential-store
/git-cvsexportcommit
/git-cvsimport
/git-cvsserver
/git-daemon
/git-diagnose
/git-diff
/git-diff-files
/git-diff-index
/git-diff-tree
/git-difftool
/git-difftool--helper
/git-describe
/git-env--helper
/git-fast-export
/git-fast-import
/git-fetch
/git-fetch-pack
/git-filter-branch
/git-fmt-merge-msg
/git-for-each-ref
/git-for-each-repo
/git-format-patch
/git-fsck
/git-fsck-objects
/git-fsmonitor--daemon
/git-gc
/git-get-tar-commit-id
/git-grep
/git-hash-object
/git-help
/git-hook
/git-http-backend
/git-http-fetch
/git-http-push
/git-imap-send
/git-index-pack
/git-init
/git-init-db
/git-interpret-trailers
/git-instaweb
/git-log
/git-ls-files
/git-ls-remote
/git-ls-tree
/git-mailinfo
/git-mailsplit
/git-maintenance
/git-merge
/git-merge-base
/git-merge-index
/git-merge-file
/git-merge-tree
/git-merge-octopus
/git-merge-one-file
/git-merge-ours
/git-merge-recursive
/git-merge-resolve
/git-merge-subtree
/git-mergetool
/git-mergetool--lib
/git-mktag
/git-mktree
/git-multi-pack-index
/git-mv
/git-name-rev
/git-notes
/git-p4
/git-pack-redundant
/git-pack-objects
/git-pack-refs
/git-patch-id
/git-prune
/git-prune-packed
/git-pull
/git-push
/git-quiltimport
/git-range-diff
/git-read-tree
/git-rebase
/git-receive-pack
/git-reflog
/git-remote
/git-remote-http
/git-remote-https
/git-remote-ftp
/git-remote-ftps
/git-remote-fd
/git-remote-ext
/git-repack
/git-replace
/git-request-pull
/git-rerere
/git-reset
/git-restore
/git-rev-list
/git-rev-parse
/git-revert
/git-rm
/git-send-email
/git-send-pack
/git-sh-i18n
/git-sh-i18n--envsubst
/git-sh-setup
/git-shell
/git-shortlog
/git-show
/git-show-branch
/git-show-index
/git-show-ref
/git-sparse-checkout
/git-stage
/git-stash
/git-status
/git-stripspace
/git-submodule
/git-submodule--helper
/git-subtree
/git-svn
/git-switch
/git-symbolic-ref
/git-tag
/git-unpack-file
/git-unpack-objects
/git-update-index
/git-update-ref
/git-update-server-info
/git-upload-archive
/git-upload-pack
/git-var
/git-verify-commit
/git-verify-pack
/git-verify-tag
/git-version
/git-web--browse
/git-whatchanged
/git-worktree
/git-write-tree
/scalar
/git-core-*/?*
/git.res
/gitweb/GITWEB-BUILD-OPTIONS
/gitweb/gitweb.cgi
/gitweb/static/gitweb.js
/gitweb/static/gitweb.min.*
/config-list.h
/command-list.h
/hook-list.h
*.tar.gz
*.dsc
*.deb
/git.spec
*.exe
*.[aos]
*.o.json
*.py[co]
.build/
.depend/
*.gcda
*.gcno
*.gcov
/coverage-untested-functions
/cover_db/
/cover_db_html/
*+
/config.mak
/autom4te.cache
/config.cache
/config.log
/config.status
/config.mak.autogen
/config.mak.append
/configure
/.vscode/
/tags
/TAGS
/cscope*
/compile_commands.json
*.hcc
*.obj
*.lib
*.sln
*.sp
*.suo
*.ncb
*.vcproj
*.user
*.idb
*.pdb
*.ilk
*.iobj
*.ipdb
*.dll
.vs/
Debug/
Release/
/UpgradeLog*.htm
/git.VC.VC.opendb
/git.VC.db
*.dSYM
/contrib/buildsystems/out

Hay un repositorio que guarda archivos gitignore de cientos de proyectos: github/gitignore