17

我有一个用 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

这给了我在 Windows 和 Linux 上都没有找到对象文件的错误。

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

抱怨在 Windows 上找不到 mktemp。git archive并且更正对(from ) 的调用git-archive不会在 tar ...:(

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

从我的角度来看,由于与最新的 python 3.3 不兼容,并且由于相同的文件抱怨,使用 2.7 仍然不能完全工作,因此已经过时。

所以我现在的问题是:最近有什么方法/方法来处理导出/归档一个包含子模块的 git 项目吗?

或者我应该检查这个工作流程的子树吗?

提前致谢

4

6 回答 6

8

我正在使用以下代码

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

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

如果你想变得花哨,你甚至可以通过重写 zip 评论

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

所有在 windows 上使用 infozip。

于 2017-10-03T19:11:57.290 回答
6

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

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

于 2013-05-26T13:59:33.330 回答
2

我们可以做一个快速的 bash 脚本,在 tar、模块和子模块中存档,在我们连接 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
于 2014-12-08T03:18:05.937 回答
1

第二种方法:https ://github.com/meitar/git-archive-all.sh部署为独立的 Bash 脚本,并且似乎仍在维护中。我发现这是一种快速拍摄项目子模块快照的简单方法。它甚至可以捕获较早的版本(有点,见下文):

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

可能会或可能不会破坏交易的几个问题:

  • 我在尝试使用该--format选项时遇到了问题——但默认的tar, 通常有效。

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

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


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

于 2015-02-25T07:31:01.660 回答
1

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

# 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。

于 2020-12-27T13:47:38.833 回答
0

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

于 2020-02-25T15:21:12.820 回答