17

gitでバージョン管理されたWebサイトディレクトリがあります。ソースコードを追跡するのではなく、使用するコードのバージョンのみを追跡する必要があるため、Twitter Bootstrap、colorbox、lessjsなどの必要なライブラリにサブモジュールを使用します。

プロジェクトをデプロイしたいので、サブモジュールコードも必要です。を使用するgit archiveと、サブモジュールからソースファイル/コードを取得できません。

次の3つのアプローチは、私が望んでいることを達成しようとしますが、機能しません。 最初のアプローチ

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

これにより、WindowsとLinuxの両方で、オブジェクトファイルが見つからないというエラーが発生します。

2番目のアプローチ https://github.com/meitar/git-archive-all.sh

Windowsでmktempが見つからないことについて文句を言います。git archiveそして、 (から)への呼び出しを修正git-archiveしても、tarにサブモジュールは与えられません... :(

3番目のアプローチ https://github.com/Kentzo/git-archive-all

最新のPython3.3と互換性がなく、samefileが文句を言うため、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

すべてinfozipを使用してWindows上で。

于 2017-10-03T19:11:57.290 に答える
6

https://github.com/Kentzo/git-archive-allは、@ Kentzoが述べたように、Linuxで動作しています。

cygwin環境(cygwinインストーラーを介してインストールされたgitとpythonを使用)では、そこでも機能します。

于 2013-05-26T13:59:33.330 に答える
2

tarを連結して圧縮した後、tar、モジュール、およびサブモジュールでアーカイブする簡単なbashスクリプトを実行できます。これは、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

2番目のアプローチ: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を使用する人はあまりいないと思いますので、両方を使用したい人はさらに少なくなります。

于 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 に答える