Y at-il une commande git qui peut émettre pour chaque commit:Git - obtenir tous les commits et blobs ils ont créé
- id
- sujet
- blobs, il a créé avec leur chemin et la taille (comme
git ls-tree -l -r <commit>
mais seulement pour les blobs créés)
Y at-il une commande git qui peut émettre pour chaque commit:Git - obtenir tous les commits et blobs ils ont créé
git ls-tree -l -r <commit>
mais seulement pour les blobs créés)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
Vous pouvez obtenir tout sauf la taille de la boîte. Celui-ci est assez proche:
git log --name-status
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.
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.
Qu'en est-il de l'utilisation de 'git log --all'? Les docs semblent impliquer que chaque commit (atteignable) inclura ... – peterflynn
@ytpete, je mentionne explicitement les commits inaccessibles dans ma réponse. – maxschlepzig
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.
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
Une autre commande utile lors de la recherche
git fsck --lost-found
montrera ballants engage. Je devais l'utiliser pour trouver un commettras ai essuyé avec une remise à zéro intempestive --hard
Mais ne prenez pas ma parole:
https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html
Umm pourriez-vous commenter? le downvote - Je vais supprimer la réponse si elle est erronée ou trompeuse! – starsinmypockets
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
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