2011-01-03 12 views
1

Ich habe ein Git Repo (lokal) und ich muss es entgittern, so dass jedes Commit in einem Ordner gespeichert wird und es gibt keine Anzeichen von git. So sollte es in Ordnern meiner Zweige und in diesen Ordnern Ordner geben, die jede Übertragung darstellen."Unarchivieren" ein Git-Repository

Ist das möglich?

+0

warum müssen Sie dies tun? –

Antwort

4

Nun, so etwas wie dieses:

n=0 
git rev-list --reverse HEAD | while read rev; do 
    n=$(expr $n + 1) 
    dir="$n-$rev" 
    mkdir "$dir" 
    git archive --format=tar "$rev" | (cd $dir && tar xvf -) 
done 

Dadurch werden die Änderungen in Ordnern setzen nummeriert "1-Hash", "2-Hash" usw. (die Formel ändern dir entsprechend zu berechnen) .

Auch das funktioniert nur für "HEAD" ... es ist schwer, ein Nummerierungsschema zu finden, wenn Sie alle Zweige benötigen, und schwer zu wissen, was sonst die Verzeichnisse heißen. Obwohl Sie einfach git rev-list --branches verwenden und dann berechnen Sie als $(git name-rev "$rev")

Ideal wäre Sie in der Lage, die Dateien mit harten Links zu extrahieren, um identische Inhalte darzustellen, aber das wäre ein bisschen mehr Arbeit!

+0

Ich dachte, du könntest das sehr vereinfachen mit 'git filter-branch --tree-filter'. Es startet jeden Filter im Root eines Checkouts dieser Revision. Du könntest den Filter 'cp -a machen. somewhere-based-on-rev' –

+0

Das ist nicht wirklich einfacher, imho. Wohlgemerkt, ich habe das oben Gesagte als Einzeiler geschrieben, es dann zur besseren Übersicht erweitert und die Revisionsnummer hinzugefügt ... nicht jeder ist so wohl mit sh, denke ich. Wenn Sie "git archive" und tar auch aus einem leeren Repo verwenden, legen Sie einfach die Umgebungsvariable GIT_DIR fest. – araqnid