2014-05-02 3 views
1

J'ai un dossier/répertoire/repo local appelé /renders. Quand je ls -a ce que je reçoisgit extrait toutes les versions/révisions de fichiers

➜ renders git:(master) ls -a 

.git 
corner_desk.jpg 
multi-person_desk.jpg 

Chacun des deux fichiers d'image a eu de nombreuses révisions commises. Toutes les versions/révisions des deux fichiers image doivent être envoyées à quelqu'un qui n'utilise pas Git et qui ne l'utilisera pas. Ils ne peuvent donc pas parcourir l'historique des validations. Quel est le moyen le plus efficace pour créer un nouveau dossier, à partir du dossier de dépôt Git, qui peut leur être envoyé (envoyé par e-mail, Dropboxed, whatevs)? Lorsque ce nouveau dossier généré est ls -a elle devrait retourner quelque chose comme

➜ renders ls -a 

corner_desk_01.jpg 
corner_desk_02.jpg 
corner_desk_03.jpg 
corner_desk_04.jpg 
corner_desk_05.jpg 
multi-person_desk_01.jpg 
multi-person_desk_02.jpg 
multi-person_desk_03.jpg 

Répondre

3

Vous pouvez obtenir git log pour vous montrer seulement les commits qui ont réellement changé un fichier particulier, et vous pouvez utiliser sa "jolie" mise en forme de sortie pour cracher des commandes pour faire ce que vous voulez. Donc, avec un peu de munging shell variable ajoutée,

git ls-files render | while read f; do 
    git log --pretty="git show %H:$f >${f%.*}_%at.${f##*.}" -- $f 
done | less # sh -x 

Les chiffres ci-dessus les fichiers avec leur horodatage de modification plutôt que d'un numéro de série, si c'est trop pour votre client, vous pouvez obtenir le shell sérialisation pour vous avec

git ls-files render | while read f; do 
    git log --reverse \ 
      --pretty="git show %H:$f >${f%.*}_\$((1000+++x)).${f##*.}" -- $f 
done | less # sh -x 
2

Vous pouvez essentiellement extraire tous les commettre les ID qui contiennent une image particulière puis utilisez git show pour les retirer un à la fois.

Dans l'exemple de script suivant, je suppose que vous avez un historique de validation linéaire, donc git log affichera chaque validation. Notez que vous devrez apporter des modifications à vos objectifs, mais cela devrait vous donner l'idée générale.

#!/bin/bash 

i=1 
for c in `git log | grep commit | awk '{print $2}' ` ; 
do 
name=`printf "%2d" $i | tr -d ' '` 
i=$(($i+1)) 
echo $name 
git show $c:Foo > "/tmp/Foo$name" 
done; 

Ce question nous dit que git show est sans danger pour les fichiers binaires.

Questions connexes