tipos tag practices etiquetas delete best git gitignore git-config

practices - git-- tag



Git excluye el archivo de una rama (2)

Quiero ignorar ciertos archivos dentro de una rama sin tener que depender de un archivo .gitignore rastreado que se sobrescribirá durante las combinaciones con otras ramas.

He seguido de cerca una respuesta de desbordamiento de pila junto con la publicación de blog vinculada , pero mi repo no parece reconocer el .git/config especificado en mi .git/config . La documentación de Git ( git-config , gitignore ) no parece mostrar cómo especificar y tratar un archivo de gitignore para una rama específica.

Mi .git/config ve así:

[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true excludesfile = +/info/exclude [branch "myspecialbranch"] excludesfile = +/info/exclude_specialbranch

Mi archivo .git/info/exclude ve así (de forma predeterminada, no lo toqué):

# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with ''#'' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ .DS_Store

No tengo un archivo .gitignore en mi "ramal especial".

Si trato de ignorar un archivo como info.php , mi archivo .git/info/exclude_specialbranch tiene este aspecto:

info.php

... pero no ignora el archivo.

Si ejecuto git status --ignored , solo muestra el archivo .DS_Store archivo de exclude predeterminado.

Sin embargo, si agrego info.php a mi archivo .git/info/exclude :

# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with ''#'' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ .DS_Store info.php

ignora el archivo perfectamente.

Tenga en cuenta que todavía funciona sin la línea excludesfile = +/info/exclude en [core] en .git/config . Git parece saber dónde está la exclude todo el sistema sin que tenga que decírselo.

Tengo la sensación de que .git/config no está reconociendo la dirección de mi archivo de exclusión personalizado:

excludesfile = +/info/exclude_specialbranch

... muy probablemente debido al uso de + para describir la ubicación del directorio .git .

¿Cuál es el método correcto para abordar los archivos de exclusión personalizados en las versiones (más recientes) de Git?

Estoy ejecutando OSX 10.9.5 y Git versión 2.2.1.


Git no admite archivos por exclusión de rama

Estás tratando de lograr algo que Git no apoya. La publicación del blog es la fuente original de este engaño que la respuesta de desbordamiento de pila solo parroteó. Como se señaló en los comentarios bajo esa respuesta, incluso la publicación del blog original contiene una discusión que pone de manifiesto que la solución no funciona y se vincula a una publicación de blog más reciente que menciona que incluso el autor no puede reproducir el comportamiento.

¿Por qué no funciona? Si lees gitignore y man git-config , encontrarás solo core.excludesfile referenciado. No hay branch.<name>.excludesfile allí. El core.excludesfile está diseñado para permitirle excluir, por ejemplo, archivos Vim .swp u otras cosas temporales que utiliza su software.

core.excludesfile

Además de .gitignore (por directorio) y .git/info/exclude , Git busca en este archivo patrones de archivos que no deben ser rastreados. " ~/ " se expande al valor de $HOME y " ~user/ " al directorio de inicio del usuario especificado. Su valor predeterminado es $XDG_CONFIG_HOME/git/ignore . Si $XDG_CONFIG_HOME no está configurado o está vacío, se usa $HOME/.config/git/ignore su lugar. Ver gitignore .

Trabajo alrededor

Creo que la mejor aproximación de un archivo por .gitignore sucursales se logra mediante el enlace posterior a la comprobación y la realización del .gitignore través de un enlace simbólico.

Cada rama tendría, por ejemplo, un directorio .gitignores con archivos nombrados después de las ramas correspondientes. Luego habría un archivo .gitignores/__default que se usaría por defecto. El .gitignore se excluiría por todos los archivos excluidos y se crearía por el enlace posterior a la comprobación como un enlace simbólico al archivo correspondiente en .gitignores .

Si no desea realizar un seguimiento de los archivos excluidos, puede hacer lo mismo con el archivo .git/info/exclude como un enlace simbólico a .git/info/excludes/__default etc.


Aquí hay un guión que escribí para hacer esto:

#!/bin/bash # This is designed to allow per-branch un-ignoring of certain files. # Use case: Compiled CSS files on master to push to server. # A special .gitignore file will be present on master at # {$gitignorePath}/{$disabledMasterGitignoreName} and that file should # enable the css files using the ! flag. @https://git-scm.com/docs/gitignore # When the branch specified by script parameters # is checked out, {$gitignorePath}/{$disabledMasterGitignoreName} is # copied to .gitignore. # On other branches this gitignore file is named $disabledMasterGitignoreName, versioned, # and {$gitignorePath}.gitignore will be deleted. Note, you must ignore # {$gitignorePath}.gitignore from your main .gitignore file # # To enable put this file in your path and call this script # in .git/hooks/post-checkout with pass a list of single-space-separated branches that # will enable the branch-specific .gitignore. # One caveat is that you can only merge into the branch containing the .gitignore # file. Otherwise you''ll end up re-committing the files. This is fine if you are # using gitflow and `master` contains your special .gitigore using the ! syntax # that is un-ignoring files. # # Background: @http://.com/questions/29579546/git-excludesfile-for-a-branch set -e gitignorePath=''docroot/sites/all/themes'' disabledMasterGitignoreName=''.gitignore_master--disabled'' #branchWithGitignoreEnabled=''master'' branch=$(git rev-parse --abbrev-ref HEAD) gitignoreRoot="$(git rev-parse --show-toplevel)/${gitignorePath}" if [ -f "${gitignorePath}/.gitignore" ] then masterGitignoreExists=true fi if [ -f "${gitignorePath}/${disabledMasterGitignoreName}" ] then disabledMasterGitignoreExists=true fi IFS='' '' read -a params <<< "$@" if [[ " ${params[@]} " =~ " ${branch} " ]] then if [ $disabledMasterGitignoreExists ] then cp -f "${gitignoreRoot}/${disabledMasterGitignoreName}" "${gitignoreRoot}/.gitignore" echo "Enabled ${gitignorePath}/.gitignore" fi elif [ $masterGitignoreExists ] then rm -f "${gitignorePath}/.gitignore" if [ masterGitignoreExists ] then echo "Disabled ${gitignorePath}/.gitignore" fi fi