2009-08-22 7 views

Répondre

26

Pour obtenir commits (tous et la sortie d'une ligne par commit):

git rev-list --all --pretty=oneline 

ensuite divisé commits en l'espace avec la limite de 2 et obtenir commettras tous les id et le message

pour obtenir blobs créé par commit (récursion à subdirs, show fusion engage, détecter renomme et copies, ne montrent pas commettre id sur la première ligne):

git diff-tree -r -c -M -C --no-commit-id <commit-sha> 

Un peu de l'analyse syntaxique de chaque ligne et hors certains d'entre eux - et nous obtenons la liste des nouveaux blobs et ils chemin pour commettre

dernier est d'obtenir des tailles de blob:

git cat-file --batch-check < <list-of-blob-shas> 

Et une autre fois un peu de l'analyse syntaxique

+1

Vous pouvez faire ce beaucoup plus rapidement en utilisant l'option '--stdin' de' diff-tree'. Par exemple, 'git rev-list --all | git diff-arbre -r --root --diff-filtre = AMC --pretty = oneline --stdin'. – Jed

+0

La réponse de maxschlepzig ci-dessous est importante: si vous essayez de faire quelque chose comme [supprimer un gros fichier de l'historique des pensions] (http://git-scm.com/book/fr/Git-Internals-Maintenance-and-Data -Recovery # Removing-Objects), vous devez vous assurer de trouver chaque commit, même si certains sont sur des branches non fusionnées! – peterflynn

5

Vous pouvez obtenir tout sauf la taille de la boîte. Celui-ci est assez proche:

git log --name-status 
3

Une solution basée sur la réponse de tig:

#!/usr/bin/perl 

foreach my $rev (`git rev-list --all --pretty=oneline`) { 
    my $tot = 0; 
    ($sha = $rev) =~ s/\s.*$//; 
    foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) { 
    $blob = (split /\s/, $blob)[3]; 
    next if $blob == "0000000000000000000000000000000000000000"; # Deleted 
    my $size = `echo $blob | git cat-file --batch-check`; 
    $size = (split /\s/, $size)[2]; 
    $tot += int($size); 
    } 
    print "$tot $rev" if $tot > 1000000; # Show only if > 1MiB 
} 

Peut-être pas le meilleur code, mais vous devriez la plupart du temps.

11

En se fondant sur git rev-list est pas toujours suffisant, car il

Liste [s] engage qui sont accessibles en suivant les liens parents de la donné commit (s) [..]

(git help rev-list)

Ainsi, il ne liste pas les validations qui sont sur une autre branche et il ne liste pas les commits qui ne sont pas accessibles par une branche (peut-être qu'ils ont été créés parce que o f quelques rebase et/ou des actions de tête détachées).

De même, git log suit simplement les liens parents de la validation en cours de sortie. Encore une fois, vous ne voyez pas de commits référencés par d'autres branches ou qui sont dans un état qui pend.

Vous pouvez vraiment obtenir tous les engage avec une commande comme ceci:

for i in `(find .git/objects -type f | 
      sed '[email protected]^.*objects/\(..\)/\(.\+\)[email protected]\1\[email protected]' ; 
      git verify-pack -v .git/objects/pack/*.idx | 
      grep commit | 
      cut -f1 -d' ';) | sort -u` 
    do 
    git log -1 --pretty=format:'%H %P %ai %s%n' $i 
done 

Pour faire simple, les empreintes du corps en boucle pour chaque commit une ligne contenant son hachage, le hachage parent (s), date et assujettir. Remarque, pour parcourir plus de tous les commets, vous devez considérer les objets emballés et pas encore emballés.

Vous pouvez imprimer les blobs référencés (et seulement ceux créés) en appelant le git diff-tree $i (et le greping pour le capitalisme A dans la cinquième colonne) du corps de la boucle.

+0

Qu'en est-il de l'utilisation de 'git log --all'? Les docs semblent impliquer que chaque commit (atteignable) inclura ... – peterflynn

+0

@ytpete, je mentionne explicitement les commits inaccessibles dans ma réponse. – maxschlepzig

0

Vous pouvez également obtenir une liste de tous commits (y compris ceux ballants) avec:

git log --walk-reflogs | grep -E -o '[0-9a-f]{40}'

Inclure cette ligne dans les paramètres d'une nouvelle vue dans gitk (dans le dernier champ d'entrée , la commande pour générer des commits supplémentaires) et vous obtiendrez un arbre qui montre également «l'historique oublié» du projet.

+1

Ne fonctionne pas pour moi: 'git log --walk-reflogs' donne une liste _shorter_ que de simplement faire' git log'. A en juger par [la page man] (http://gitmanual.org/git-reflog.html), le reflet n'est en aucun cas garanti être une liste exhaustive de tous les commits ou de toutes les branches ... – peterflynn

Questions connexes