2011-02-26 18 views
50

Recientemente reorganicé mis archivos dotf para vivir dentro de un repositorio Git en ~/Dropbox/dotfiles y estoy usando patógeno para agrupar todos los complementos Vim dentro de ~/Dropbox/dotfiles/home/.vim/bundle. Estos complementos se agregaron como submódulos de Git.archivos .gitignore agregados dentro de los submódulos de Git

Ahora el problema es que cuando ejecuto Vim, automáticamente genera la documentación para todos los complementos y los coloca dentro de cada directorio de submódulos. Esto agrega contenido sin seguimiento a los submódulos, lo que me gustaría evitar.

[email protected] ~/Dropbox/dotfiles ‹master*› $ git st 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# (commit or discard the untracked or modified content in submodules) 
# 
# modified: home/.vim/bundle/fuzzyfinder (untracked content) 
# modified: home/.vim/bundle/l9 (untracked content) 
# modified: home/.vim/bundle/matchit (untracked content) 
# modified: home/.vim/bundle/ruby (untracked content) 
# ... 
no changes added to commit (use "git add" and/or "git commit -a") 

He intentado añadir un archivo .gitignore a la raíz de mi repositorio Git para ignorar todas las carpetas dentro de doc submódulos, pero esto no parece funcionar:

home/.vim/bundle/**/doc 

Mi pregunta: ¿hay una forma de ignorar archivos y carpetas dentro de los submódulos de Git o quizás configurar Vim para crear la documentación en una carpeta fuera del repositorio de Git?

EDIT: como Randy Morris señaló, esto podría ser un duplicado de Generating tags to different location by pathogen

+0

Posible duplicado: http://stackoverflow.com/questions/4343544/generating-tags-to-different- location-by-pathogen # 4346300 –

+0

Tienes razón. Va a marcar la pregunta. ¡Gracias! – rubiii

+1

Nota: '**' en '.gitignore' no significa" a cualquier profundidad ". –

Respuesta

64

Debe añadir .gitignore en cada uno de sus submódulos.
Dado que dichos submódulos son como el repositorio de Git anidado, se ocupan de sus propias reglas de ignorar, y su estado no estaría influenciado por el .gitignore del repositorio primario (como explained here).

Para una configuración específica de vim, como Randy Morris menciona en el comentario, vea la pregunta "Generating tags to different location by pathogen" de SO.


Nota: como se menciona en este Nick comentarios, y como se ilustra en la respuesta a "Generating tags to different location by pathogen", una configuración como:

[submodule "path/to/submodule"] 
    path = path/to/submodule 
    url = http://github.com/username/repo.git 
    ignore = untracked # <==== 

va a funcionar y hacer que el submódulo ignorado por git status.
Pero "ignore = untracked" means at least Git1.7.2.


Nota: nurettin menciona in the comments:

ignore = dirty lo hizo por mí

Commit aee9c7d detalla la diferencia entre untracked y dirty.

  • "dirty": Sólo las diferencias de la confirmación registran en el SuperProject y los submódulos HEAD serán consideradas modificaciones, todos los cambios en el árbol de trabajo del submódulo serán ignorados.
    Al usar este valor, el submódulo no se analizará en absoluto para detectar cambios en el árbol de trabajo, lo que redundará en un beneficio de rendimiento en los submódulos grandes.

  • "untracked": Sólo los archivos sin seguimiento en los submódulos Árbol de trabajo son ignorados, un cambió HEAD y/o modificado archivos en el submódulo marcará como modificada.

+0

No me gusta modificar los repositorios Git de otras personas, pero la opción 'ignore = untracked' funciona bien. ¡Muchas gracias! – rubiii

+1

Necesita la versión de Git 1.7.2 al menos para que funcione la configuración ignorar = sin seguimiento. Vea los comentarios aquí: http://stackoverflow.com/questions/4343544/generating-tags-to-different-location-by-pathogen/4346300#4346300 –

+1

@Nick: buen punto. Lo he incluido en la respuesta. – VonC

-2

Creo que el problema básico aquí es que está tratando de ignorar un cambio 'rastreado'. .gitignore ignora solo los cambios 'sin seguimiento' en el repositorio. Para verificar que puede modificar algún archivo en su repositorio (que se rastreó) y también agregarlo a su archivo .gitignore. Al hacer git status, verá que el archivo todavía aparece como 'modificado'. Los repo de su submódulo también se consideran rastreados por su repositorio principal, por lo tanto, simplemente agregar un gitignore al repositorio principal no funcionará. Como sugirió othere, agregue .gitignore reglas de repositorios individuales o si está usando una versión reciente de git, puede usar el git status --ignore-submodules.

+1

no. esos archivos son nuevos y están "sin seguimiento". lo siento, pero eso no ayuda a resolver el problema. – rubiii

8

La recomendación de VonC de ignore = untracked funciona, pero debe realizar el cambio para cada uno de esos submódulos.

Si desea resolver el problema de una vez por todas, se puede configurar un patrón de gitignore mundial en cada repositorio git, por git config --global core.excludesfile ~/.gitignore_global, a continuación, sólo tiene que añadir doc/tags a $ HOME/.gitignore_global.

Ver https://help.github.com/articles/ignoring-files.

1

La respuesta de Ben es un buen comienzo. Pero para esa regla de ignorar específica, no me gusta la configuración global.

Prefiero configuración local para cada submódulo, y un sistema centralizado de archivos en la raíz del repositorio submódulo ignoran:

cd .vim/bundle 
echo "doc/tags" > .gitignore_submodules 
git submodule foreach git config --local core.excludesfile "../.gitignore_submodules" 
Cuestiones relacionadas