¿Cómo cambiar un submódulo de git para que apunte a una subcarpeta?

101

Hojeando el tutorial submódulo , creé un submódulo del proyecto boto . Luego, descubrí que en realidad solo necesito un subconjunto de este proyecto, específicamente, la carpeta boto .

Me gustaría cambiar mi submódulo para que apunte a esta carpeta. Cuando miro en .gitmodules, veo

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

¿Qué URL debo usar en lugar de https://github.com/boto/boto.git ? Después de cambiar la URL, ¿debo eliminar la carpeta boto localmente y volver a extraer?

destripador234
fuente
3
No es exactamente lo que quiere - no es un submódulo - pero es posible echar un vistazo agit subtree
Cascabel
1
Lo que terminé haciendo fue tener el submódulo completo y decirle a IntelliJ que la carpeta boto es una 'carpeta de origen', para que pueda encontrar paquetes en ella.
ripper234
15
No puedo creer que git no haga esto de forma nativa ... ¡Ay!
rogerdpack
2
Encontré una pregunta similar - stackoverflow.com/questions/1121227/…
sashoalm

Respuestas:

65

Me temo que la URL de los submódulos siempre apunta al repositorio; no puedes especificar que solo quieres una subcarpeta de un repositorio, de la misma manera que git no admite "clones estrechos" en general.

Si no puede vivir con tener todo el repositorio como un submódulo, siempre puede crear un nuevo repositorio que se clone de boto y luego configurar un trabajo cron para:

  1. git fetch ese repositorio en un directorio
  2. Úselo git filter-branchpara actualizar una rama donde el subdirectorio está en el nivel superior.
  3. Agregue esa rama del repositorio como submódulo. Sin embargo, todo eso es un poco complicado y mi preferencia sería vivir con el repositorio completo como un submódulo.
Mark Longair
fuente
24

No puede clonar solo una parte de un repositorio. Esto se debe a que git trata el repositorio como un objeto completo: cuando lo obtienes, lo obtienes todo .

Entonces, la solución aquí sería buscar el submódulo en otro directorio, luego usar un enlace simbólico para lograr su objetivo.

Artefact2
fuente
Tengo enlaces simbólicos en Windows ... también funciona bien. (eso es debido a msys que tengo en mi máquina, por lo que puedo usar ln -scomo en Linux)
kumarharsh
7
Vista y vienen con MKLink. Yo uso eso. howtogeek.com/howto/windows-vista/…
Angel S. Moreno
1
En su lugar, puede usar enlaces
físicos
15

Lo que quiere hacer es crear una rama en el submódulo y mover la carpeta hacia arriba y eliminar lo que no necesita. Luego, puede administrar esa rama en su lugar. Si desea aumentar los cambios, primero debería poder realizar la fusión hacia atrás. Git sabrá que movió los archivos y fusionó correctamente.

Espero que esto ayude.

Adam Dymitruk
fuente
¿Qué es una "fusión inversa"? ¿Puede darnos un ejemplo?
Sukima
una fusión que va "aguas arriba" - de una rama de orden superior a una de orden inferior. Linus los odia. Se vinculan en la historia de otras ramas que pueden haberse fusionado ya.
Adam Dymitruk
¿Podría agregar algún ejemplo sobre la "fusión inversa" en esta situación?
Xiao
Por lo general, es cuando intenta mantener actualizada su rama de características fusionando cosas de una rama de la línea principal donde todos están fusionando sus últimos cambios. Esto es malo porque vincula su rama con el trabajo de otros. Si el producto requiere su rama pero no una de las otras que ya están en la rama de integración, no es posible.
Adam Dymitruk
idea interesante, ¿alguien ha probado esto? Lo intentaré pronto, pero todavía no estoy seguro de que la "fusión
inversa