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