如何使用git-archive包含裸存储库中的子模块

时间:2011-03-30 06:11:04

标签: git deployment git-submodules git-bare

我正在设置部署脚本。基本过程是:

  1. 将更改推送到服务器上的裸存储库
  2. 然后根据新标签为该版本创建一个新文件夹。
  3. 使用git archive将文件移至发布目录
  4. 运行一些迁移脚本并将其置于活动状态(如果一切都成功)。
  5. 问题是我的存储库包含一个子模块,它不会被放入存档中,因此不会放入发布目录。

    我见过git-archive-all,但这不适用于裸存储库。

    如果不可能,我正在考虑,

    1. 使存储库不是裸露的,并更新工作副本,这将允许我使用git-archive-all。或
    2. 在服务器上有一个子模块的第二个裸存储库,我可以从中获取存档(必须查看这个以确保我得到正确的版本)。

6 个答案:

答案 0 :(得分:3)

我使用这个python包https://github.com/Kentzo/git-archive-all。您可以使用

安装它
pip install git-archive-all

在OSX上,您也可以使用brew install git-archive-all

进行安装

答案 1 :(得分:2)

如果您的子模块位于可从服务器访问的repo中,我宁愿使用post-receive hook

  • 更新一个完整的非裸仓库(所以在您的原始裸仓旁边的第二个仓库),包括子模块(git submodule update --init
  • 来自第二个回购的
  • git archive(你肯定会得到正确的版本,因为非裸回购将引用正确版本的子模块)
    由于非裸仓库将包含父仓库其子模块,git archive-all将能够检测.git子目录并存档所有内容

如果无法从服务器访问子模块,则表示:

  • 需要在服务器上推送自己的仓库
  • 父repo中的子模块需要使用相对路径进行引用,以便父repo在服务器上推送后仍然能够检索所述子模块。

答案 2 :(得分:1)

答案 3 :(得分:1)

这里只是几个班轮:

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" --

答案 4 :(得分:0)

在常规归档命令后运行以下命令:
git submodule foreach 'cd REPO_ROOT/$path && git archive HEAD | tar -x -C TARGET_ROOT/$path'

此处,REPO_ROOT是您的仓库所在的位置,而TARGET_ROOT是您存档的版本。 (我假设您有一个TARGET_ROOT文件夹,其中第一个git archive调用的扩展版本。如果您想要最终的zip / tar,您可以tar / zip最终文件夹)

git submodule foreach提供$path变量。有关详细信息,请参阅git help submodule foreach部分。

答案 5 :(得分:0)

基于此处的回答和评论。您可以创建非裸仓库并运行:

git ls-files --recurse-submodules | tar caf ../prog.tar.gz -T-
  • 要处理以连字符开头的文件,请使用 --verbatim-files-from
  • 要将文件放在存档内的文件夹中,请使用 --xform s:^:prog/:

完整版:

git ls-files --recurse-submodules | tar caf ../prog.tar.gz --xform s:^:prog/: --verbatim-files-from -T-