如何使用git-archive来包含裸仓库中的子模块?

zvms9eto  于 9个月前  发布在  Git
关注(0)|答案(6)|浏览(88)

我正在设置部署脚本。基本过程是:
1.将更改推送到服务器上的裸存储库
1.然后根据新的标签将创建一个新的文件夹的版本。
1.使用git archive将文件移动到release目录下
1.安装一些迁移脚本并将其激活(如果一切成功)。
问题是我的存储库包含一个子模块,它没有被放在存档中,因此没有被放在发布目录中。
我见过git-archive-all,但它在裸库上不起作用。
如果不可能,我在考虑,
1.使仓库不空,并更新工作副本,这将允许我使用git-archive-all。或者
1.在服务器上有一个子模块的第二个裸存储库,我可以从中获得一个存档(必须查看这个以确保我得到正确的修订版)。

6yt4nkrj

6yt4nkrj1#

基于这里的答案和评论。你可以创建非裸存储库并运行:

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-

w3nuxt5m

w3nuxt5m2#

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

pip install git-archive-all

字符串
在OSX上,您也可以使用brew install git-archive-all安装它

gblwokeq

gblwokeq3#

如果你的子模块在一个可以从服务器访问的仓库中,我宁愿有一个post-receive钩子,

  • 更新一个完整的非空repo(所以在你原来的空repo旁边有第二个repo),包括子模块(git submodule update --init
  • git archive从第二个repo(你一定会得到正确的版本,因为非裸repo会引用子模块的正确版本)

由于非裸存储库将包含父存储库 * 和 * 其子模块,因此git archive-all将能够检测.git子目录并归档 * 所有内容 *。
如果子模块无法从服务器访问,这意味着:

  • 它需要在服务器上的自己的存储库中推送
  • 父存储库中的子模块需要用相对路径来引用,以便父存储库一旦被推送到服务器上就仍然能够检索所述子模块。
noj0wjuj

noj0wjuj5#

下面是一个简短的例子:

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

字符串

n9vozmp4

n9vozmp46#

在常规归档命令之后运行以下命令:
第一个月
在这里,REPO_ROOT是你的repo所在的位置,TARGET_ROOT是你放置存档版本的位置。(我假设你有一个TARGET_ROOT文件夹,第一个git archive的扩展版本在那里调用。如果你想要一个最终的zip/tar,你可以tar/zip最终的文件夹)
git submodule foreach提供了$path变量。有关详细信息,请参阅git help submodule foreach部分。

相关问题