Extraer archivos de git con su historia

Esta es una traducción de este artículo que he necesitado en más de una ocasión para resolver este mismo problema.

La idea es la siguiente: Tienes dos repositorios, y quisieras importar en el primero algunas carpetas o archivos del segundo, conservando su historial de cambios. Las razones para necesitar esto son variadas pero no las discutiré en este artículo.

Los pasos son los siguientes:

Crear el parche

En este paso se crea un archivo que contiene todos los commits que afectan la ruta de tu interés. Los commits están ordenados cronológicamente y en ese orden serán aplicados.

$ cd ~/repository/path
$ git log --pretty=email --patch-with-stat --reverse --full-index --binary -- path/to/file_or_folder > /tmp/patch

Realiza cualquier cambio de rutas que necesites

Es posible que necesites ajustar las rutas relativas a la raíz del repositorio en que terminarán los archivos que estás importando. En este paso se reemplazan todas las rutas en el archivo de parche para indicar la nueva ubicación del archivo o carpeta.

$ sed -i -e 's/deep\/path\/that\/you\/want\/shorter/short\/path/g' /tmp/patch

Aplica los commits en el nuevo repo

Para este paso necesitarás estar en la raíz del repositorio destino y ahí se aplicarán los commits. Esto funcionará bien a menos que alguna ruta de los archivos que estás importando coincida con una ruta existente en el nuevo repositorio.

$ cd ~/another_repository/path
$ git am < /tmp/patch

Fin

Y ¡Listo! Si todo salió bien ya tienes los archivos en el nuevo repo con toda su historia.