这是一个git存档-所有风格的脚本的一部分,它将从一个git项目及其所有子模块生成一个tarball。
子模块档案必须单独生成,并附加到超级项目的存档中。但是我想把它们附加到超级工程档案中,比如:
git archive --format=tar ... > super.tar
# pseudo git foreach submodule ; do
(cd $submodule && git archive --format=tar ...) | tar -Af super.tar
# done但super.tar是未经修改的。tar -Af super.tar -是无效的。
我可以分两个阶段来做,但我希望我只是愚蠢,不知道该怎么做。
以下是分两个步骤完成的:
git archive --format=tar ... > super.tar
# pseudo git foreach submodule ; do
(cd $submodule && git archive --format=tar ...) > $submodule.tar
tar -Af super.tar $submodule.tar && rm -f $submodule.tar
# done发布于 2022-04-04 21:52:11
tar是令人惊讶的挑剔的管道,因为某些原因!我尝试了各种替代方案(见下文),并检查了手册中的所有选项,并得出结论认为,使用GNU 1.34是不可能的。
在确定了这一点之后,还有其他的选择,例如bsdtar,它可以很好地处理管道和stdin/stdout。但是语法有一点不同。您可以使用--append,默认情况下,它会将整个存档添加到现有存档中。要只将给定存档中的文件添加到结果存档中,需要使用一个特殊的@前缀,请参考手册。这个例子适用于我:
sudo apt install libarchive-tools # package was named bsdtar previously
bsdtar --version
# bsdtar 3.4.3 - libarchive 3.4.3 zlib/1.2.11 liblzma/5.2.5
# bz2lib/1.0.8 liblz4/1.9.3 libzstd/1.4.8
echo foo > bar
# --no-fflags is to avoid the harmless "unknown extended header
# keyword 'SCHILY.fflags'" warning when extracting with GNU tar.
# I also force it to produce ustar because that is what GNU tar
# creates by default afaik.
bsdtar --format=ustar --no-fflags --create --file result.tar bar
tar tvlf result.tar
# -rwx------ user/group 4 2022-04-04 23:29 bar
echo bar > foo
echo argh > oof上面设置了所有这些以获得一个工作示例,这是您想要的主要命令行:
tar -cf /dev/stdout foo oof |
bsdtar --format=ustar --no-fflags --append --file result.tar @-
tar tvlf result.tar
# -rwx------ user/group 4 2022-04-04 23:29 bar
# -rwx------ user/group 4 2022-04-04 23:40 foo
# -rwx------ user/group 5 2022-04-04 23:40 oof这里是我尝试过的死胡同,如果直接管道不工作并且-不被接受的话,它们可能会显示出一些替代方案。
不使用-作为输入,您可以尝试使用<( ... )进行进程替换。因为我不想使用git archive,所以我不得不强制tar压缩到stdout,以创建一些附加在动态中的替代输入。但是,使用--file -只提供:
tar: Refusing to write archive contents to terminal因此,我不得不欺骗tar使用--file /dev/stdout。不幸的是,即使是这样:
tar -Af super.tar <( tar -cf /dev/stdout foo )打印没有警告,只留下super.tar不动。从stdin读取而不是使用FIFO文件具有相同的结果:
git archive | tar -Af super.tar /dev/stdinhttps://stackoverflow.com/questions/13934254
复制相似问题