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

前端 未结 5 1067
南方客
南方客 2020-12-14 02:07

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 wi
相关标签:
5条回答
  • 2020-12-14 02:28

    Run the following after the regular archive command:
    git submodule foreach 'cd REPO_ROOT/$path && git archive HEAD | tar -x -C TARGET_ROOT/$path'

    Here the REPO_ROOT is where your repo stands and the TARGET_ROOT is where you put your archived version. (I assume that you have a TARGET_ROOT folder where the expanded version of the first git archive call. If you want a final zip/tar, you can tar/zip the final folder)

    git submodule foreach provides the $path variable. See git help submodule foreach section for more details.

    0 讨论(0)
  • 2020-12-14 02:33

    I use this python package https://github.com/Kentzo/git-archive-all. You can install it by using

    pip install git-archive-all
    

    On OSX, you can install it also using brew install git-archive-all

    0 讨论(0)
  • 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.
    0 讨论(0)
  • 2020-12-14 02:35

    Here it is as a few-liner:

    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" --
    
    0 讨论(0)
  • 2020-12-14 02:48

    This should do the trick: https://github.com/meitar/git-archive-all.sh/wiki

    0 讨论(0)
提交回复
热议问题