kmi*_*ndi 14 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"
Run Code Online (Sandbox Code Playgroud)
Thomas Rast在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中的子模块...... :(
第3种方法 https://github.com/Kentzo/git-archive-all
从我的观点来看已经过时了,因为它不兼容最新的python 3.3并且仍然没有完全使用2.7,因为samefile抱怨.
所以现在我的问题是:是否有最近的方法/方法来处理导出/存档包含子模块的git项目?
或者我应该检查此工作流程的子树?
提前致谢
我正在使用以下代码
git archive -o release.zip HEAD
git submodule --quiet foreach 'cd $toplevel; zip -ru release.zip $sm_path'
Run Code Online (Sandbox Code Playgroud)
创建一个包含所有子模块的 git 存储库的完整存档。
如果你想变得花哨,你甚至可以通过重写 zip 注释
echo -e "Repository:\n$(git rev-parse HEAD)\nSubmodule status:\n$(git submodule status)" | zip -u release.zip -z
Run Code Online (Sandbox Code Playgroud)
所有在使用 infozip 的 Windows 上。
https://github.com/Kentzo/git-archive-all正在Linux下工作,正如@Kentzo所述.
在cygwin环境中(通过cygwin安装程序安装git和python)它也可以在那里工作.
如果您和我一样是 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
Run Code Online (Sandbox Code Playgroud)
结果将是 file result.tar.gz... 当然,您可以选择另一个提交,而不是 HEAD 。