我有一个用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项目?
或者我应该检查此工作流程的子树?
提前致谢
答案 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。