Jacob Jacob - 15 days ago 5
Git Question

How can I use git-archive to include submodules from a bare repository

I'm in the process of setting up a deployment script. The basic process is:


  1. Push changes to a bare repository on the server

  2. Then based on new tags will create a new folder for the release.

  3. Use git archive to move the files into the release directory

  4. Runs some migrations scripts and puts it live (if all is successful).



The issue is my repository contains a submodule, which doesn't get put in the archive, and therefore doesn't get put in the release directory.

I've seen git-archive-all, but that doesn't work on a bare repository.

If its not possible, I'm considering,


  1. making the repository not bare, and updating the working copy, which would allow me to use git-archive-all. Or

  2. having a second bare repository of the submodule on the server, which I could get an archive from (would have to look into this to make sure I'm getting the right revision).


Answer

If your submodule is in a repo accessible from the server, I would rather have a post-receive hook which would

  • update a full non-bare repo (so a second repo beside your original bare one), including the submodule (git submodule update --init)
  • git archive from that second repo (you would be sure to get the right version since the non-bare repo would reference the right version of the submodule)
    Since the non-bare repo would contain the parent repo and its submodules, git archive-all would be able to detect the .git subdirectories and would archive everything.

If the submodule isn't accessible from the server, that means:

  • it needs to be pushed in its own repo on the server
  • the submodule in the parent repo needs to be reference with a relative path, in order for the parent repo to still be able to retrieve said submodule once pushed on the server.
Comments