¿Es posible consultar subdirectorios de un repositorio en Git?
Imagina que estoy configurando una nueva instalación de WordPress. Crearé dos nuevos directorios para mi plugin y personalización del tema:
wordpress/wp-content/plugins/myplugins/
wordpress/wp-content/themes/mytheme/
Quiero mantener estos directorios a través de Git. En Subversion, me gustaría lograr esto por tener trunk/myplugins/
y trunk/mytheme/
directorios y subdirectorios a cabo la comprobación. ¿Git tiene una manera de lograr la misma tarea usando un único repositorio?
Podría perderme el barco en algún paradigma de Git, como un usuario de SVN desde hace mucho tiempo con poca exposición a Git.
Editar: varias ramas que almacenan contenido diferente es una forma interesante de manejar esto.
git
sparse-checkout
Annika Backstrom
fuente
fuente
Respuestas:
Los pagos escasos ahora están en Git 1.7 .
También vea la pregunta “ ¿Es posible hacer un pago escaso sin consultar primero todo el repositorio? ".
Tenga en cuenta que los pagos escasos aún requieren que descargue todo el repositorio, a pesar de que algunos de los archivos que descarga Git no terminarán en su árbol de trabajo.
fuente
git clone
simple comando ?? Bueno, estoy usando esta respuesta , ¡está funcionando!/foo/bar/foobar
, ¿es posible verlo solo como/foobar
en mi repositorio local?No hay una forma real de hacerlo en git. Y si no va a realizar cambios que afecten a ambos árboles a la vez como una sola unidad de trabajo, no hay una buena razón para usar un único repositorio para ambos. Pensé que echaría de menos esta función de Subversion, pero descubrí que crear repositorios tiene tan poca sobrecarga mental administrativa (simplemente debido al hecho de que los repositorios se almacenan justo al lado de su copia de trabajo, en lugar de obligarme a elegir explícitamente algún lugar fuera del copia de trabajo) que me acostumbré a hacer muchos repositorios pequeños de un solo propósito.
Sin embargo, si insiste (o realmente lo necesita), podría hacer un repositorio git con just
mytheme
ymyplugins
directorios y vincularlos desde la instalación de WordPress.MDCore escribió:
Tenga en cuenta que esto no es una preocupación para git, si decide colocar ambos directorios en un único repositorio, porque git elimina por completo el concepto de números de revisión monotónicamente crecientes de cualquier forma.
El único criterio para saber qué cosas reunir en un único repositorio en git es si constituye una sola unidad, es decir. en su caso, si hay cambios en los que no tiene sentido mirar las ediciones en cada directorio de forma aislada. Si tiene cambios en los que necesita editar archivos en ambos directorios a la vez y las ediciones pertenecen juntas, deben ser un repositorio. Si no, entonces no los juntes.
Git realmente quiere que uses repositorios separados para entidades separadas.
Los submódulos no abordan el deseo de mantener ambos directorios en un repositorio, porque en realidad impondrían tener un repositorio separado para cada directorio, que luego se unen en otro repositorio utilizando submódulos. Peor aún, dado que los directorios dentro de la instalación de WordPress no son subdirectorios directos del mismo directorio y también son parte de una jerarquía con muchos otros archivos, usar los repositorios por directorio como submódulos en un repositorio unificado no ofrecería ningún beneficio, ya que el unificado el repositorio no reflejaría ningún caso de uso / necesidad.
fuente
git clone
secuencia de comando simple ?? Bueno, estoy usando esta respuesta , ¡está funcionando!Una cosa que no me gusta de los pagos escasos, es que si desea pagar un subdirectorio que tiene unos pocos directorios de profundidad, la estructura de su directorio debe contener todos los directorios que lo conducen.
La forma de solucionar esto es clonar el repositorio en un lugar que no sea mi espacio de trabajo y luego crear un enlace simbólico en el directorio de mi espacio de trabajo al subdirectorio del repositorio. Git funciona así bastante bien porque cosas como el estado de git mostrarán los archivos de cambio en relación con su directorio de trabajo actual.
fuente
En realidad, los pagos "estrechos" o "parciales" o "escasos" se encuentran en desarrollo actual y pesado para Git. Tenga en cuenta que todavía tendrá el repositorio completo debajo
.git
. Por lo tanto, las otras dos publicaciones son actuales para el estado actual de Git, pero parece que finalmente podremos realizar pagos escasos. Consulte las listas de correo si le interesan más detalles: están cambiando rápidamente.fuente
git clone --filter
de Git 2.19Esta opción realmente omitirá la búsqueda de objetos innecesarios del servidor:
El servidor debe configurarse con:
No hay soporte de servidor a partir de v2.19.0, pero ya se puede probar localmente.
file://$(path)
se requiere para superar lasgit clone
travesuras de protocolo: ¿Cómo clonar superficialmente un repositorio git local con una ruta relativa?Recuerde que eso
--depth 1
ya implica--single-branch
, vea también: ¿Cómo clono una sola rama en Git?TODO:
--filter=blob:none
omite todos los blobs, pero aún recupera todos los objetos del árbol. Pero en un repositorio normal, esto debería ser pequeño en comparación con los archivos en sí, por lo que esto ya es lo suficientemente bueno. Preguntado en: https://www.spinics.net/lists/git/msg342006.html Devs respondió un--filter=tree:0
está trabajando para hacerlo.El formato de
--filter
está documentado enman git-rev-list
.Se realizó una extensión al protocolo remoto Git para admitir esta función.
Documentos en el árbol de Git:
Pruébalo
GitHub aguas arriba .
Salida en Git v2.19:
Conclusiones: todos los blobs desde fuera de
d1/
faltan .Tenga en cuenta que
root/root
ymybranch/mybranch
también faltan, pero lo--depth 1
oculta de la lista de archivos faltantes. Si elimina--depth 1
, se muestran en la lista de archivos faltantes.fuente
Como señala su edición, puede usar dos ramas separadas para almacenar los dos directorios separados. Esto los mantiene a ambos en el mismo repositorio, pero aún no puede tener confirmaciones que abarquen ambos árboles de directorios. Si tiene un cambio en uno que requiere un cambio en el otro, tendrá que hacerlos como dos confirmaciones separadas, y abre la posibilidad de que un par de pagos de los dos directorios puedan estar fuera de sincronización.
Si desea tratar el par de directorios como una unidad, puede usar 'wordpress / wp-content' como la raíz de su repositorio y usar el archivo .gitignore en el nivel superior para ignorar todo menos los dos subdirectorios de interés. Esta es probablemente la solución más razonable en este momento.
Supuestamente, los pagos escasos han estado llegando durante dos años, pero todavía no hay señales de ellos en el repositorio de desarrollo de git, ni ninguna indicación de que los cambios necesarios llegarán allí. No contaría con ellos.
fuente
No puede pagar un solo directorio de un repositorio porque todo el repositorio es manejado por la única carpeta .git en la raíz del proyecto en lugar de la miríada de directorios .svn de subversion.
El problema con trabajar en complementos en un único repositorio es que hacer un compromiso, por ejemplo, mytheme incrementará el número de revisión para myplugin , por lo que incluso en subversión es mejor usar repositorios separados.
El paradigma de subversión para subproyectos es svn: externals, que se traduce de alguna manera en submódulos en git (pero no exactamente en el caso de que haya usado svn: externals antes).
fuente
Hay una inspiración aquí. Solo utiliza
shell regex
ogit regex
.Use la cita para escapar de la interpretación de expresiones regulares de shell y pase comodines a git.
El primero no es recursivo, solo archivos en 1 profundidad
subdir
. Pero el segundo es recursivo.En cuanto a su situación, lo siguiente puede ser suficiente.
Simplemente piratea las líneas según sea necesario.
fuente
Puede revertir los cambios no confirmados solo a un archivo o directorio en particular:
fuente