Подтвердить что ты не робот

Git экспорт архива с подмодулями (git архив все/рекурсивный)

У меня есть каталог веб-сайтов с версией git. Я использую подмодули для требуемых библиотек, таких как Twitter Bootstrap, colorbox и lessjs, потому что я не должен отслеживать исходный код, а только версию своего кода, который я использую.

Теперь я хочу развернуть проект, и поэтому мне тоже нужен код подмодуля. Используя git archive, я не получаю исходные файлы/код из подмодулей.

Следующие три подхода TRY для достижения того, что я хочу, но не работают: 1-й подход

#!/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

Жалобы на mktemp не найдены в Windows. И исправление вызовов git archive (от git-archive) не дает подмодулей в tar...: (

3-й подход https://github.com/Kentzo/git-archive-all

Я устарел с моей точки зрения, не будучи совместимым с последним python 3.3 и все еще не полностью работая, используя 2.7, потому что тот же файл жалуется.

Итак, мой вопрос: Есть ли какой-либо недавний способ/подход к экспорту/архивированию проекта git, включая подмодули?

Или нужно проверить поддеревья для этого рабочего процесса?

Заранее спасибо

4b9b3361

Ответ 1

https://github.com/Kentzo/git-archive-all теперь работает под Linux, как заявила @Kentzo.

В среде cygwin (с git и python, установленным через установщик cygwin) он также работает там.

Ответ 2

Мы могли бы сделать быстрый bash script, где архив в tar, модуле и подмодулях, после того, как мы конкатенируем следы и сжимаем, вот пример с двумя дополнительными модулями:

#!/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

Второй подход: https://github.com/meitar/git-archive-all.sh развертывается как автономный Bash script и, как представляется, сохраняется. Я нашел, что это простой способ сделать быстрый субмодуль, включающий моментальный снимок проекта. Он может даже захватить более раннюю версию (вроде, см. Ниже):

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

Несколько проблем, которые могут быть или не быть нарушителями сделки:

  • У меня возникли проблемы с попыткой использовать параметр --format - но по умолчанию, tar, как правило, работал.

  • (очень) большая проблема: он захватил мой подмодуль, но только в его текущей версии - не указанной версии. Упс!

Будучи Bash script, для этого, вероятно, требуется какой-то уровень совместимости Linux (например, Cygwin) под Windows.


Похоже, что это должна быть встроенная возможность Git - она ​​слишком сложна для сборки вместе со сценарием. Я думаю, что не многие люди используют подмодули или git -archive, поэтому еще меньше хотят использовать оба.

Ответ 4

Я использую следующий код

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

Все в окнах с помощью infozip.