2013-02-08 12 views
12

Ho una directory del sito Web con versione git. Uso i sottomoduli per le librerie richieste come Twitter Bootstrap, colorbox e lessjs perché non dovrei monitorare il codice sorgente ma solo la versione del codice che uso.Esportazione archivio git con sottomoduli (git archive all/recursive)

Ora voglio distribuire il progetto e quindi ho bisogno anche del codice del sottomodulo. Usando git archive Non ottengo il codice sorgente/codice dai sottomoduli.

I seguenti tre approcci cercare di ottenere quello che voglio, ma Dont't lavoro: primo approccio

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

Thomas Rast in http://git.661346.n2.nabble.com/Running-git-archive-recursively-over-submodules-td4577012.html

Questo mi dà errori sia in Windows come in Linux che non ci sono file di oggetti trovati.

secondo approccio https://github.com/meitar/git-archive-all.sh

lamenta mktemp non trovato su Windows. E correggere le chiamate a git archive (da git-archive) non dà sottomoduli nella tar ... :(

terzo approccio https://github.com/Kentzo/git-archive-all

non è aggiornato dal mio punto di vista da non essere compatibile con ultimo python 3.3 e ancora non completamente funzionante utilizzando 2,7 perché samefile lamenta

Quindi la mia domanda è ora:. c'è un recente modo/metodo di trattare con l'esportazione/archiviare un progetto Git compreso sottomoduli

?

Oppure devo controllare i sottoalberi per questo flusso di lavoro?

Grazie in anticipo

+0

Sono l'autore di Kentzo/git-archive-all. È compatibile con Python 3.3 ora. Qual è l'altro problema? – Kentzo

risposta

2

Potremmo fare uno script bash veloce, dove archivio in catrame, moduli e sottomoduli, dopo che concateniamo catrami e comprimere, qui è un esempio con moduli 2 sub:

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

Il secondo approccio : https://github.com/meitar/git-archive-all.sh distribuisce come script Bash autonomo e sembra essere ancora mantenuto. Ho trovato che fosse un modo semplice per prendere un rapido sottomodulo incluso l'istantanea di un progetto. Si può anche catturare una revisione precedente (sorta di, vedi sotto):

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

Un paio di problemi che possono o non possono essere interruttori affare:

  • mi sono imbattuto in problemi cercando di utilizzare il Opzione --format - ma l'impostazione predefinita, tar, generalmente funzionava.

  • Il (molto) grosso problema: ha catturato il mio submodule, ma solo nella sua versione corrente - non nella versione specificata. Ops!

Essendo uno script Bash, questo probabilmente richiede un tipo di strato di compatibilità Linux (come Cygwin) da eseguire in Windows.


Sembra che questa dovrebbe essere una funzionalità incorporata di Git: è troppo complicato da assemblare con gli script. Immagino che non molte persone usino i sottomoduli o git-archive, quindi ancora meno vogliono usarli entrambi.

+1

Il noto vantaggio di questo approccio era che * può anche catturare una revisione precedente * (anche se non funzionava davvero). Neanche io vedo come farlo automaticamente con la soluzione @Kentzo. La soluzione @Sergio sembra (in qualche modo) fare questo, ma non l'ho ancora testato personalmente. Immagino che tu debba fare un vero checkout (e aggiornamento del sottomodulo) con * all * di queste soluzioni - qualcosa che non è richiesto per un normale 'git archive'. – nobar

1

Sto utilizzando il seguente codice

git archive -o release.zip HEAD 
git submodule --quiet foreach 'cd $toplevel; zip -ru release.zip $path' 

per creare un archivio completo di un repository git con tutti i moduli.

Se si vuole essere di fantasia si può anche riscrivere il commento zip via

echo -e "Repository:\n$(git rev-parse HEAD)\nSubmodule status:\n$(git submodule status)" | zip -u release.zip -z 

Tutto su Windows utilizzando InfoZip.

Problemi correlati