带子模块的git archive export(git archive all / recursive)

时间:2013-02-08 23:37:11

标签: git-submodules git-archive

我有一个用git版本化的网站目录。我使用子模块来处理Twitter Bootstrap,colorbox和lessjs等必需的库,因为我不应该跟踪源代码,而只跟踪我使用的代码版本。

现在我想部署项目,因此我也需要子模块代码。 使用git archive我没有从子模块中获取源文件/代码。

以下三种方法尝试实现我想要但不起作用: 第一种方法

#!/bin/sh

export revision="$1"

export GIT_INDEX_FILE=".git/tmpindex"
rm -f "$GIT_INDEX_FILE"

git read-tree $revision

export up="$(pwd)"

read_one_level () {
        export GIT_ALTERNATE_OBJECT_DIRECTORIES="$GIT_ALTERNATE_OBJECT_DIRECTORIES":$(
            git submodule foreach 'echo "$up/$path/.git/objects"' |
            grep -E -v '^(Entering|No submodule mapping found)' |
            tr '\n' : |
            sed 's/:$//'
        )

        git submodule foreach '
                cd "$up"
                subcommit=$(git rev-parse :"$path")
                git rm --cached "$path"
                git read-tree -i --prefix="$path/" $subcommit
        ' >/dev/null
}

while git ls-files -s | grep -q ^160000; do
    read_one_level
done

git archive --format=tar $(git write-tree)

rm -f "$GIT_INDEX_FILE" 

托马斯拉斯特http://git.661346.n2.nabble.com/Running-git-archive-recursively-over-submodules-td4577012.html

这给我带来了错误,无论是在Linux上还是在Linux中都没有找到对象文件。

第二种方法 https://github.com/meitar/git-archive-all.sh

抱怨在Windows上找不到mktemp。并且纠正对git archive(来自git-archive)的调用不会给tar中的子模块... :(

第3种方法 https://github.com/Kentzo/git-archive-all

从我的观点来看已经过时了,因为它与最新的python 3.3兼容,并且仍然没有完全使用2.7,因为samefile抱怨。

所以现在我的问题是: 是否有最近的方法/方法来处理导出/存档包含子模块的git项目?

或者我应该检查此工作流程的子树?

提前致谢

6 个答案:

答案 0 :(得分:5)

https://github.com/Kentzo/git-archive-all正在Linux下工作,正如@Kentzo所说。

在cygwin环境中(通过cygwin安装程序安装了git和python)它也可以在那里工作。

答案 1 :(得分:3)

我使用以下代码

git archive -o release.zip HEAD
git submodule --quiet foreach 'cd $toplevel; zip -ru release.zip $path'

创建包含所有子模块的git存储库的完整存档。

如果你想表达,你甚至可以通过

重写zip评论
echo -e "Repository:\n$(git rev-parse HEAD)\nSubmodule status:\n$(git submodule status)" | zip -u release.zip -z

所有在Windows上使用infozip。

答案 2 :(得分:2)

我们可以做一个快速的bash脚本,在我们连接tars和compress之后存档tar,模块和子模块,这里有一个带有2个子模块的例子:

#!/bin/bash

set -e

pwd=$(pwd)
date=$(date +%Y%m%d)
package=gitreponame
branch=master
name=tarbz2name
submodule1=/src/app/sub1/
submodule2=/src/sub2/

pushd ${package}
git checkout ${branch}
git pull
tag=$(git rev-list HEAD -n 1 | cut -c 1-7)
git archive --prefix="${name}/" --format=tar master > "$pwd"/${name}-${date}-${tag}.tar

git submodule update --init

cd ${submodule1}
git archive  --prefix="${name}${submodule1}" --format=tar master > "$pwd"/sb1.tar
cd -

cd ${submodule2}
git archive --prefix="${name}${submodule2}" --format=tar master > "$pwd"/sb2.tar
popd

tar -Af ${name}-${date}-${tag}.tar sb1.tar
tar -Af ${name}-${date}-${tag}.tar sb2.tar
bzip2 ${name}-${date}-${tag}.tar
rm sb1.tar sb2.tar

答案 3 :(得分:1)

第二种方法:https://github.com/meitar/git-archive-all.sh作为独立的Bash脚本部署,看起来仍然是维护的。我发现这是一个简单的方法来获取项目的快速子模块包含快照。它甚至可以捕获早期版本(有点,见下文):

git-archive-all.sh --tree-ish (tag) ## for example

可能会或可能不会成为交易破坏者的一些问题:

  • 我在尝试使用--format选项时遇到了问题 - 但默认情况下tar通常有效。

  • (非常)大问题:它捕获了我的子模块,但仅限于其当前版本 - 而不是指定的版本。糟糕!

作为Bash脚本,这可能需要在Windows下运行某种Linux兼容层(如Cygwin)。


看起来这应该是Git的内置功能 - 它太复杂了,无法与脚本拼凑在一起。我想没有多少人使用子模块 git-archive,所以更少的人想要同时使用它们。

答案 4 :(得分:0)

我使用bash开发了git-archive-with-submodules。它还具有允许创建包含未提交的更改的存档的好功能。

答案 5 :(得分:0)

如果您和我一样是 KISS 的朋友,您可以使用@t-b 但我发现此解决方案不会存档嵌套子模块的答案。以下代码将有所帮助

# archive main directory
$ git archive --format tar -o release.tar HEAD
# descend recursively and archive each submodule
$ git submodule --quiet foreach --recursive 'git archive --format tar --prefix=$displaypath/ -o submodule.tar HEAD'
# concatenate with main archive
$ TOPDIR=$(pwd) git submodule --quiet foreach --recursive 'cd $TOPDIR; tar --concatenate --file=release.tar $displaypath/submodule.tar; rm -fv $displaypath/submodule.tar'
$ gzip -9 release.tar

结果将是文件 result.tar.gz ... 当然,您可以选择另一个提交而不是 HEAD。