Nunca había probado, pero git help ignoresugiere que si se pone una .gitignorecon *.jsen /public/static, que va a hacer lo que quiere.
Nota: asegúrese de consultar también la respuesta de Joeys a continuación: si desea ignorar los archivos en un subdirectorio específico, un .gitignore local es la solución correcta (la localidad es buena). Sin embargo, si necesita el mismo patrón para aplicar a su repositorio completo, entonces la solución ** es mejor.
Esa no es necesariamente la mejor solución. Potencialmente, las personas necesitarán explorar diferentes archivos .gitignore para descubrir por qué se ignora su archivo. Algunos prefieren tener toda esta información en un archivo .gitignore almacenado en el directorio raíz del repositorio.
haren
1
@haren no es la única solución: la respuesta de Joey también es válida. Elija lo que funcione mejor para usted. Yo diría que ignorar las reglas locales de un directorio debería estar en ese directorio, y que las reglas globales deberían ser globales. (Además, esta respuesta es antigua y no creo que ** fuera compatible en ese momento).
ptyx
209
Parece que la **sintaxis es compatible con la gitversión de 1.8.2.1acuerdo con la documentación .
Dos asteriscos consecutivos (" **") en patrones que coinciden con el nombre de ruta completo pueden tener un significado especial:
Un " **" inicial seguido de una barra inclinada significa coincidencia en todos los directorios. Por ejemplo, " **/foo" coincide con el archivo o directorio " foo" en cualquier lugar, igual que el patrón " foo". " **/foo/bar" coincide con el archivo o directorio " bar" en cualquier lugar que esté directamente debajo del directorio " foo".
Un " /**" final coincide con todo lo que hay dentro. Por ejemplo, " abc/**" coincide con todos los archivos dentro del directorio " abc", en relación con la ubicación del .gitignorearchivo, con profundidad infinita.
Una barra inclinada seguida de dos asteriscos consecutivos y luego una barra inclinada coincide con cero o más directorios. Por ejemplo, " a/**/b" coincide " a/b", " a/x/b", " a/x/y/b" y así sucesivamente.
Otros asteriscos consecutivos se consideran inválidos.
xxx/**apunta a todos los archivos y directorios dentro de xxxmientras que xxx/apunta al xxxdirectorio directamente. Esto realmente solo importa cuando se niegan patrones con !"No es posible volver a incluir un archivo si se excluye un directorio padre de ese archivo", por lo que usar xxx/*o xxx/**sería necesario en ese caso.
joeyhoer
44
Git debe ignorar todos los archivos con el .meta final. ¿Como funciona esto? **.js?
Negro
"Otros asteriscos consecutivos se consideran inválidos". lo resume todo
imrok
68
ACTUALIZACIÓN: Eche un vistazo a la respuesta de @ Joey : Git ahora admite la **sintaxis en los patrones. Ambos enfoques deberían funcionar bien.
Los patrones leídos de un archivo .gitignore en el mismo directorio que la ruta, o en cualquier directorio principal, con patrones en los archivos de nivel superior (hasta el nivel superior del árbol de trabajo) anulados por aquellos en archivos de nivel inferior hasta el directorio que contiene el archivo
Lo que esto significa es que los patrones en un .gitignorearchivo en cualquier directorio dado de su repositorio afectarán ese directorio y todos los subdirectorios .
El patrón que proporcionaste
/public/static/**/*.js
no es del todo correcto, en primer lugar porque (como notó correctamente) la **sintaxis no es utilizada por Git. Además, las /anclas iniciales que patrón al inicio del nombre de ruta. (Por lo tanto, /public/static/*.jscoincidirá /public/static/foo.jspero no/public/static/foo/bar.js ). Quitar el inicio /tampoco funcionará, coincidiendo con rutas como public/static/foo.jsy foo/public/static/bar.js. EDITAR: simplemente eliminar la barra inclinada tampoco funcionará, ya que el patrón todavía contiene una barra inclinada, Git lo trata como un globo de shell simple y no recursivo (gracias @Joey Hoer por señalar esto).
Como sugirió @ptyx, lo que debe hacer es crear el archivo <repo>/public/static/.gitignoree incluir solo este patrón:
*.js
No hay encabezado /, por lo que coincidirá en cualquier parte de la ruta, y ese patrón solo se aplicará a los archivos en el /public/staticdirectorio y sus subdirectorios.
Esto no es del todo cierto, específicamente la parte "Quitar el líder /tampoco funcionará, haciendo coincidir rutas como public/static/foo.jsy foo/public/static/bar.js". Es falso. Para citar la documentación "Si el patrón no contiene una barra oblicua /, Git lo trata como un patrón glob de shell y comprueba una coincidencia con el nombre de ruta en relación con la ubicación del archivo .gitignore (en relación con el nivel superior del árbol de trabajo si no de un archivo .gitignore) ". foo/public/static/bar.jsno coincidiría porque el patrón contiene a /.
joeyhoer
@JoeyHoer gracias por el consejo, he actualizado mi respuesta en consecuencia.
Adam Sharp
9
Para ignorar los archivos no rastreados solo vaya a .git / info / exclude. Excluir es un archivo con una lista de extensiones o archivos ignorados.
Esto no se transferiría a otros clones del repositorio como lo haría .gitignore (después de haberse comprometido, por supuesto).
jpmc26
3
Creo que la solución más simple sería usar find. No me gusta tener múltiples .gitignoremerodeando en subdirectorios y prefiero administrar un nivel superior único .gitignore. Para hacerlo, simplemente puede agregar los archivos encontrados a su .gitignore. Suponiendo que ese /public/static/sea su proyecto / git home, usaría algo como:
Respuestas:
Nunca había probado, pero
git help ignore
sugiere que si se pone una.gitignore
con*.js
en/public/static
, que va a hacer lo que quiere.Nota: asegúrese de consultar también la respuesta de Joeys a continuación: si desea ignorar los archivos en un subdirectorio específico, un .gitignore local es la solución correcta (la localidad es buena). Sin embargo, si necesita el mismo patrón para aplicar a su repositorio completo, entonces la solución ** es mejor.
fuente
Parece que la
**
sintaxis es compatible con lagit
versión de1.8.2.1
acuerdo con la documentación .fuente
xxx/**
yxxx/
?xxx/**
apunta a todos los archivos y directorios dentro dexxx
mientras quexxx/
apunta alxxx
directorio directamente. Esto realmente solo importa cuando se niegan patrones con!
"No es posible volver a incluir un archivo si se excluye un directorio padre de ese archivo", por lo que usarxxx/*
oxxx/**
sería necesario en ese caso.**.js
?ACTUALIZACIÓN: Eche un vistazo a la respuesta de @ Joey : Git ahora admite la
**
sintaxis en los patrones. Ambos enfoques deberían funcionar bien.La página del comando man gitignore (5) dice:
Lo que esto significa es que los patrones en un
.gitignore
archivo en cualquier directorio dado de su repositorio afectarán ese directorio y todos los subdirectorios .El patrón que proporcionaste
no es del todo correcto, en primer lugar porque (como notó correctamente) la
**
sintaxis no es utilizada por Git. Además, las/
anclas iniciales que patrón al inicio del nombre de ruta. (Por lo tanto,/public/static/*.js
coincidirá/public/static/foo.js
pero no/public/static/foo/bar.js
).Quitar el inicioEDITAR: simplemente eliminar la barra inclinada tampoco funcionará, ya que el patrón todavía contiene una barra inclinada, Git lo trata como un globo de shell simple y no recursivo (gracias @Joey Hoer por señalar esto)./
tampoco funcionará, coincidiendo con rutas comopublic/static/foo.js
yfoo/public/static/bar.js
.Como sugirió @ptyx, lo que debe hacer es crear el archivo
<repo>/public/static/.gitignore
e incluir solo este patrón:No hay encabezado
/
, por lo que coincidirá en cualquier parte de la ruta, y ese patrón solo se aplicará a los archivos en el/public/static
directorio y sus subdirectorios.fuente
/
tampoco funcionará, haciendo coincidir rutas comopublic/static/foo.js
yfoo/public/static/bar.js
". Es falso. Para citar la documentación "Si el patrón no contiene una barra oblicua /, Git lo trata como un patrón glob de shell y comprueba una coincidencia con el nombre de ruta en relación con la ubicación del archivo .gitignore (en relación con el nivel superior del árbol de trabajo si no de un archivo .gitignore) ".foo/public/static/bar.js
no coincidiría porque el patrón contiene a/
.Para ignorar los archivos no rastreados solo vaya a .git / info / exclude. Excluir es un archivo con una lista de extensiones o archivos ignorados.
fuente
Creo que la solución más simple sería usar
find
. No me gusta tener múltiples.gitignore
merodeando en subdirectorios y prefiero administrar un nivel superior único.gitignore
. Para hacerlo, simplemente puede agregar los archivos encontrados a su.gitignore
. Suponiendo que ese/public/static/
sea su proyecto / git home, usaría algo como:Descubrí que cortar
./
al principio a menudo es necesario para que git entienda qué archivos evitar. Por lo tanto elcut -c 3-
.fuente