¿Cómo puedo usar git-archive para include submodules desde un repository simple?

Estoy en el process de configurar un script de implementación. El process básico es:

  1. Empujar los cambios a un repository simple en el server
  2. Luego, según las nuevas tags, se creará una nueva carpeta para el lanzamiento.
  3. Usa git archive para mover los files al directory de versiones
  4. Ejecuta algunos guiones de migraciones y lo pone en funcionamiento (si todo es exitoso).

El problema es que mi repository contiene un submodule que no se coloca en el file y, por lo tanto, no se coloca en el directory de publicación.

He visto git-archive-all , pero eso no funciona en un repository simple.

Si no es posible, estoy considerando,

  1. hacer que el repository no esté al descubierto, y actualizar la copy de trabajo, lo que me permitiría usar git-archive-all. O
  2. tener un segundo repository vacío del submodule en el server, del cual podría get un file (tendría que ver esto para asegurarse de get la revisión correcta).

Si su submodule está en un repository accesible desde el server, preferiría tener un gancho de post-recepción que

  • actualice un repository completo no desnudo (por lo tanto, un segundo repository al lado del original), incluido el submodule ( git submodule update --init )
  • git archive de ese segundo repository (estarías seguro de get la versión correcta, ya que el repository non-bare haría reference a la versión correcta del submodule)
    Como el repository non-bare contendría el repo padre y sus submodules, git archive-all podría detectar los subdirectorys .git y archivaría todo .

Si el submodule no es accesible desde el server, eso significa:

  • necesita ser empujado en su propio repo en el server
  • el submodule en el repository padre debe ser una reference con una ruta relativa, para que el repository padre pueda recuperar dicho submodule una vez que se haya insertado en el server.

Aquí es como un trazador de líneas:

 prefix=$(basename "$(pwd -P)") { git ls-files git submodule foreach --recursive --quiet \ 'git ls-files --with-tree="$sha1" | sed "s#^#$path/#"' } | sed "s#^#$prefix/#" | xargs tar -c -C.. -f "$prefix.tar.xz" -- 

Yo uso este package de Python https://github.com/Kentzo/git-archive-all . Puedes instalarlo usando

 pip install git-archive-all 

En OSX, puede instalarlo también usando brew install git-archive-all

Ejecute lo siguiente después del command regular de file:
git submodule foreach 'cd REPO_ROOT/$path && git archive HEAD | tar -x -C TARGET_ROOT/$path'

Aquí el REPO_ROOT es donde se encuentra su repo y el TARGET_ROOT es donde coloca su versión archivada. (Supongo que tiene una carpeta TARGET_ROOT donde está la versión expandida de la primera llamada de git archive . Si desea un git archive zip / tar final, puede tar / zip la carpeta final)

git submodule foreach proporciona la variable $path . Consulte la sección de git help submodule para get más detalles.