экспорт архива git с подмодулями (архив git all / рекурсивный)
у меня есть каталог веб-сайта с версией git. Я использую подмодули для необходимых библиотек, таких как Twitter Bootstrap, colorbox и lessjs, потому что я не должен отслеживать исходный код, а только версию их кода, который я использую.
теперь я хочу развернуть проект, и поэтому мне тоже нужен код подмодуля.
Используя git archive
Я не получаю исходные файлы / код из подмодулей.
следующие три подхода пытаются достичь того, что я хочу, но не работают: 1-й подходи!--10-->
#!/bin/sh
export revision=""
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, что нет файлов объектов.
2-й подход https://github.com/meitar/git-archive-all.sh
жалуется на mktemp не найден в Windows. И исправляя вызовы git archive
(от git-archive
) не дает подмодулей в смоле ...:(
3-й подход https://github.com/Kentzo/git-archive-all
устарел с моей точки зрения, не будучи совместимым с последним python 3.3 и все еще не полностью работает с помощью 2.7, потому что samefile жалуется.
Итак, мой вопрос сейчас: Есть ли какой-либо недавний способ/подход к экспорту/архивированию проекта git, включая подмодули?
или я должен проверить поддеревьев для этого процесса?
спасибо заранее
4 ответов
https://github.com/Kentzo/git-archive-all теперь работает в Linux @Kentzo заявил.
в среде cygwin (с Git и python, установленными через Cygwin installer) он тоже работает.
мы могли бы сделать быстрый скрипт bash, где архив в tar, module и sub-modules, после того, как мы объединяем tars и сжимаем, вот пример с 2 sub modules:
#!/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
2-й подход: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-архив, поэтому еще меньше хотят использовать оба.
Я использую следующий код
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.