30

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

  1. 将更改推送到服务器上的裸存储库
  2. 然后基于新标签会为发布创建一个新文件夹。
  3. 使用 git archive 将文件移动到发布目录
  4. 运行一些迁移脚本并将其上线(如果一切都成功)。

问题是我的存储库包含一个子模块,它没有放入存档中,因此没有放入发布目录。

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

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

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

6 回答 6

6

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

pip install git-archive-all

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

于 2016-11-18T18:09:48.110 回答
4

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

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

完整版本:

git ls-files --recurse-submodules | tar caf ../prog.tar.gz --xform s:^:prog/: --verbatim-files-from -T-
于 2021-05-04T18:07:58.227 回答
3

如果您的子模块位于可从服务器访问的 repo 中,我宁愿有一个 post-receive 挂钩

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

如果无法从服务器访问子模块,则意味着:

  • 它需要推送到服务器上自己的仓库中
  • 父 repo 中的子模块需要使用相对路径进行引用,以便父 repo 在推送到服务器后仍然能够检索所述子模块。
于 2011-03-30T06:29:30.420 回答
1

这应该可以解决问题:https ://github.com/meitar/git-archive-all.sh/wiki

于 2012-08-23T15:10:00.080 回答
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" --
于 2012-10-15T20:51:05.283 回答
-1

在常规归档命令之后运行以下命令:
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 部分。

于 2013-05-30T18:47:27.737 回答