2010-07-08 24 views
10

Estoy usando el comando de subárbol de Git para incorporar un par de bibliotecas a un proyecto.Procedimiento para clonar repositorios Git que usan el subárbol

Si clono el proyecto de la manera normal, termino con todo el código que necesito, pero pierdo las relaciones del subárbol: en el clon no hay control remoto para cada una de las bibliotecas, y no hay -push branch para cualquiera de ellos.

¿Cuál es la mejor manera de restablecer esta conexión?

¿Es suficiente para hacer

git remote add <lib> <remote-url> 
git fetch <lib> 

Si estaba añadiendo la biblioteca por primera vez que había que seguir con:

git subtree add -P <local/lib> --squash "<lib>/master" 

Esto no funciona cuando el directorio local ya Existe, sin embargo, que por supuesto lo hará cuando haya clonado un proyecto que ya haya tenido la biblioteca agregada.

¿Hay algo más que se debería hacer en esta situación, para asegurar que el subárbol git subsiguiente fusione y gite los comandos de división del subárbol a lo esperado?

+0

'git subtree' no es un comando estándar de git ... –

+0

" Una alternativa experimental al comando git-submodule "- https://github.com/apenwarr/git-subtree/ –

Respuesta

3

La forma en que he creado en el pasado esa relación fue haciendo una combinación de subárbol.

git pull -s subtree <lib> master 

incluso si no hay nada que combinar en/tirar debería simplemente regresar sin hacer nada. Siéntase libre de agregar --squash al pull anterior para que no ingrese ningún historial remoto.

8

tuve problema muy similar

Aquí es cómo creé el sub-árbol en un primer momento

git remote add -f sub_project url_to_remote_repository/project.git 
git merge -s ours --no-commit sub_project/master 
git read-tree --prefix=sub/project/ -u sub_project/master 
git commit -m "Added subtree merged in sub/project" 

y para conseguir cambios desde el repositorio "proyecto", que estaba haciendo

git pull -s subtree sub_project master 

Ahora, empujé mi repositorio local a github y desde otra máquina cloné mi repositorio de github En ese punto, obtuve todo lo esperado le en sub/proyecto ... así que es genial. Pero no más remoto, y relación con sub/proyecto. Así que hice lo siguiente

git remote add -f sub_project url_to_remote_repository/project.git 
git merge -s ours --no-commit --squash sub_project/master 
git pull -s subtree sub_project master 

y que funcionaba bien. Ahora soy capaz de gestionar el subárbol de ese repositorio clonado como antes

git pull -s subtree sub_project master 

Nota:

1) en nuestro proyecto, antes de que estábamos usando submódulos git que realmente no era bueno para nuestros usuarios. Es por eso que cambiamos al sistema de subárboles de git.
2) Tuve algunos errores extraños al hacer esas operaciones en una máquina con Windows (usando git versión 1.7.9.msysgit.0), y las mismas operaciones se realizaron con éxito en Linux. Así que ahora, para manipular el subárbol, a menudo uso linux (y si tengo algún error, intento lo mismo en Linux).

Espero que esto te pueda ayudar.

+1

No lo hago Comprenda cómo se restablece la asignación de prefijos del subdirectorio en la secuencia de comandos que ha descrito después de una nueva clonación. ¿No debería haber un "sub/proyecto" en alguna parte de los comandos? –

+0

Cuando probé el comando de combinación anterior intenté fusionar todo en el nivel superior de mi proyecto. Sin embargo, este comando parecía funcionar: "git merge --squash -s recursive -Xsubtree = sub/project --no-commit tracking_branch" –

+0

En realidad, esto funcionó aún mejor: "git merge --squash -s ours -Xsubtree = sub/proyecto --no-commit tracking_branch " –

0

Me encontré con esta pregunta al migrar un proyecto de usar submódulos a subárboles y terminé usando ninguno (al menos no directamente, de todos modos) - Ahora estoy usando la herramienta git-subrepo.

Resuelve este problema agregando un archivo .gitrepo en la raíz de cada subárbol. El archivo .gitrepo contiene información de seguimiento, incluida la URL remota, y luego se incluye en clones posteriores. Esto realmente simplifica las cosas y la única complicación es que git-subrepo debe instalarse por separado en cada máquina de desarrollo (aunque el repositorio aún se puede usar sin él).

Cuestiones relacionadas