¿Cómo voy a una confirmación específica usando git-subtree?

Estoy usando el git-subtree de Avery Pennarun, que es una extensión de git.

¿Cómo selecciono una confirmación de un sub-repo en mi repository principal utilizando el subtree de git? Además, ¿cómo puedo ir a un compromiso específico en la historia del sub-repo después de que ya he hecho un subtree de git en ese prefijo?

Principalmente estoy ejecutando esto en el modo squash commits.

¿cómo voy a un compromiso específico en la historia del sub-repo?

Si has aplastado las confirmaciones, entonces no hay forma, ya que la calabaza pierde las diferentes confirmaciones.

De lo contrario, con un subtree no aplastado, puede navegar a cualquier confirmación del subtree con el mismo hash que tiene en el repository original desde el que se creó el subtree.

git subtree (sin squash) realmente agrega en su repository todas las confirmaciones relevantes del repository externo como un tree independiente dentro de su repository actual. Al hacer un git subtree add , puede observar que se agregan varias confirmaciones (todas las confirmaciones originales del repository externo) y una última confirmación de fusión que traslada el contenido de ese subtree al directory especificado especificado con la opción --prefix . En pocas palabras, verifica una twig de otro repository no relacionado y luego la combina en su twig actual moviendo todo ese contenido en una subcarpeta determinada.

Todo lo que esto significa es que la historia del repository externo está disponible para usted, puede realizar la compra de la misma manera, teniendo en count que al ser un tree completamente diferente, este process probablemente modifique TODOS los contenidos de su espacio de trabajo, que a gran escala los proyectos pueden ser largos.

Esto nos mueve a la segunda:

¿Cómo selecciono una confirmación de un sub-repo en mi repository principal utilizando el subtree de git?

Parece que no hay un "ramillete" actual apoyado por el git subtree en sí mismo. Pero dadas las implicaciones de todo lo anterior, se puede hacer lo siguiente.

 # move yourself to the subtree commit of your choice git checkout <subtree-hash> # fetch commits from the subtree repository, to have available the commit you want # to cherry pick. git fetch <path-to-remote> # cherry pick the hash you want git cherry-pick <cherry-hash> # move back to your original branch git checkout <your-branch> # subtree merge your cherry pick (using the previous HEAD), # so that it gets moved to the correct location specified by prefix. git subtree merge --prefix <subtree-prefix> [email protected]{1} # Since you probably fetched more commits that you needed from # the remote, you might want to clean those that where not needed git gc 

Tenga en count que, después de hacer esto, si trata de git subtree pull inserte una actualización en su subtree e incluye la confirmación que eligió, terminará con un conflicto ya que tendrá dos cambios en el mismo lugar.

Otra opción más simple, si tiene acceso al repository de subtreees original, es hacer que la selección de cereza allí en una twig y luego simplemente git subtree pull esa twig específica.