¿Cómo haces que Git ignore los archivos sin usar .gitignore?

132

Debido a restricciones externas extrañas, no puedo modificar el .gitignorede mi repositorio. ¿Hay alguna forma de ignorar archivos y directorios que no sea modificar a .gitignore? Incluso si es una solución global como una configuración global que se aplicará a todos mis repositorios.

pupeno
fuente

Respuestas:

178

No olvide, según gitignore , que existe un orden de precedencia en las diferentes "ignorar fuentes de patrones" que Git considera:

  • Los patrones leídos desde la línea de comandos para aquellos comandos que los admiten.
  • Los patrones leídos de un archivo .gitignore en el mismo directorio que la ruta, o en cualquier directorio padre, con patrones en los archivos de nivel superior (hasta la raíz) siendo anulados por aquellos en archivos de nivel inferior hasta el directorio que contiene el archivo.
  • Patrones leídos de $GIT_DIR/info/exclude.
  • Patrones leídos del archivo especificado por la variable de configuración core.excludesfile.

Los dos últimos pueden ser una solución para su problema, pero:

  • no se replican para un repositorio distante
  • pueden tener sus patrones anulados por las otras fuentes

(Ver también esta pregunta SO )


Las otras dos soluciones implican actualizar el índice ( git update-index):

Sin embargo, cuando realiza el pago en otra sucursal o cuando usted git pull, ese estado de "ignorar" podría restablecerse. De ahí la otra opción:

La diferencia entre los dos se explica en " Git - Diferencia entre ' assume-unchanged' y ' skip-worktree' ".

VonC
fuente
Puede usar update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn el
1
@ElijahLynn seguro. Tu tambien tienes update-index --skip-work-tree. He editado la respuesta para agregar algunos enlaces a respuestas antiguas que ilustran esos dos update-indexcomandos.
VonC
140

Si puede modificar .git/info/exclude, puede poner las mismas reglas allí. Pero ese archivo está solo dentro de su repositorio local.

Ólafur Waage
fuente
Parece que esta es probablemente tu mejor apuesta; le permite excluir archivos de su repositorio local.
Abizern
1
¿Cómo funciona esto con submódulos? No hay .gitdirectorio en un submódulo ...
zakdances
10
@yourfriendzak la .gitcarpeta de un submódulo está realmente en parent_repo/.git/modules/submodule_name. Así que editaríasparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell el
25

Hay tres formas de decirle a GIT qué archivos ignorar:

  • .gitignore archivos
  • $GIT_DIR/.git/info/exclude
  • Archivos apuntados a través de la core.excludesfileconfiguración

Los últimos dos puntos podrían resolver su problema.

Para más información, ver gitignore (5) .

Fernando Beyer
fuente
5

Si solo desea tener algunos archivos locales en el repositorio y la ubicación del subdirectorio es flexible, puede colocar sus archivos tracked_dir1/tracked_dir2/untracked_dir/y luego agregar un tracked_dir1/tracked_dir2/untracked_dir/.gitignorecontenido con:

*

Es decir

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>
David Winiecki
fuente
4

He estado en situaciones similares, así que estoy agregando mi solución preferida que no veo mencionada. El problema con git update-index --assume-unchangeden este caso es que no puede hacerlo para un archivo no rastreado. Tu dijiste

No puedo modificar el .gitignore de mi repositorio.

Asumiré que lo que quieres decir es que no puedes empujar ningún cambio .gitignoreal origen. Si ese es el caso, lo que puede hacer es agregar el archivo no rastreado a su local .gitignore, luego haga git update-index --assume-unchanged .gitignoreque su cambio .gitignorenunca se presione. Ahora está ignorando el archivo (posiblemente) no rastreado y no afecta el .gitignorearchivo remoto .

Tony
fuente
3

Ignorar los cambios locales en los archivos rastreados: git update-index --assume-unchanged my-file.php

Ignorar los cambios locales en los archivos rastreados: git update-index --no-assume-unchanged my-file.php

fuente: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.
Elijah Lynn
fuente
1

De otra manera:

  • editar local .gitignore
  • luego git update-index --assume-unchanged .gitignore
Langpavel
fuente