2012-10-09 17 views
8

Estoy usando git-subárbol (de Avery Pennarun). En mi actual repositorio git tengo, por supuesto, todos mis archivos/carpetas de proyectos y un subárbol llamado "lib". Si ahora clono este git repo usando git clone obtengo todos los archivos del proyecto y el subárbol "lib" (todo como debería ser). Lo que intenté ahora: cambié algo dentro del subárbol "lib" en el repositorio clonado y traté de volver a enviar los cambios al repositorio remoto del subárbol "lib" usando git subtree push, pero no funcionó. ¿Cuál es el problema? ¿Tengo que agregarlo como subárbol primero con git subtree add?git-subárbol: Cambios de inserción de un repositorio clonado

Thx de antemano

+0

¿Cómo agregaste el subárbol a tu proyecto de nivel superior? ¿Acabas de hacer un directorio y clonarlo? –

+0

¡Hola! Agregué el subárbol a mi proyecto de nivel superior usando "git subtree add". Tal vez mi pregunta no sea lo suficientemente clara: si clono el repositorio en otra máquina, entonces tengo todos los archivos de proyectos más el subárbol "lib". Ahora cambio algo dentro del subárbol "lib" en el repositorio clonado, no puedo volver a enviar los cambios al servidor remoto usando "git subreeree push", ese es mi problema. – arge

+0

¿Te ayudó la respuesta? –

Respuesta

14

exención de responsabilidad, sospecho que no soy más que unos pocos días antes de que learing sobre subárbol :-)

Si usted está usando git subtree push usted no está dando subárbol suficiente información para extraer y empuja tus cambios

Si clonó el repositorio correctamente, el subárbol ya estará allí. El Subárbol necesita que se le diga de qué subárbol desea empujar (incluso si solo tiene uno) y también necesita saber a dónde presionar, específicamente, no desea presionar al repositorio de nivel superior. Por lo tanto, desea algo como:

git subtree push --prefix=lib [email protected]:arges-github/lib.git master 

Obviamente, el repositorio y el refspec se deben cambiar para que coincidan con su repositorio.

Si desea ver qué está sucediendo aquí (y ayuda), el subárbol en realidad divide los cambios que afectan a los archivos dentro del subárbol en una rama diferente y luego lo envía al repositorio del subárbol. Para ver que esto suceda, utilice subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib 

continuación, echar un vistazo a la rama que ha realizado:

git checkout lib-changes 

y, empujar manualmente

git push [email protected]:arges-github/lib.git master 

Si esto no es trabajando entonces puede ser que no hayas fusionado el subárbol en tu repositorio. Cuando se agrega un subárbol:

git subtree add --squash --prefix lib [email protected]:arges-github/lib.git master 

también es necesario combinar el subárbol y empujarlo de vuelta a su cesión temporal de nivel superior.

git subtree pull --squash --prefix lib [email protected]:arges-github/lib.git master 
git push 
+0

Había ejecutado los pasos hasta el "agregar". No encontré ninguna documentación que sugiera que se requiera una "extracción" posterior. ¿Qué pasaría si la primera "extracción" inicial no se realiza en el subárbol después del "agregar"? El problema al que me enfrento es que incluso después de "agregar" con --squash, cuando trato de "subtree push", comienza a inspeccionar todos los commits en ese subárbol desde el principio de los tiempos, aunque quiero que solo presione esos commits que están después de que el subárbol fue "agregado" de nuevo en el repositorio contenedor. – Nishith

1

Tenía exactamente el mismo problema que estaba teniendo y lo resolví utilizando esencialmente el enfoque sugerido por Roger Nolan. Sin embargo, si tienes la mala suerte de estar en un sistema de archivos insensible a mayúsculas y minúsculas como yo, también debes asegurarte de que cada vez que hagas un pull y un push, el caso de tu prefijo permanezca igual.

Cuando termine confundiendo la caja por error, git pensará que tiene dos subárboles, mientras que solo uno existirá en el sistema de archivos.

Así que la solución que terminé con (en caso de que ayuda a nadie) es:

  1. crear un script que empujará a su sub-árbol. Llámalo publish_<your-subtree-name>.
  2. Crea otra secuencia de comandos que extraerá tu subárbol. Llámalo update_<your-subtree-name>.
  3. Crea una rama temporal en tu HEAD y prueba la actualización. Si su secuencia de comandos es correcta, su rama de temperatura no se moverá.
  4. Clone el repositorio del subárbol en otro lugar, agregue un commit de prueba, empújelo e intente introducirlo en su repositorio utilizando el script de actualización que acaba de escribir.
  5. Si todo funciona, elimine su rama temporal y ahora compruebe ambos scripts en el repositorio de super proyecto.
  6. Luego, cuando necesite empujar o tirar subárboles, use los scripts.

PS> El parámetro --squash es importante, especialmente si las diferentes ramas de sus reporsitorios están arrastrando diferentes ramas del subárbol y también si tiene múltiples subárboles en su proyecto.

Cuestiones relacionadas