2017-04-21 1 views
0

Je n'arrive pas à obtenir git log pour produire des notes pour la consommation de la machine.Vider le "git log --notes" dans le shell shell?

git log va ouvrir less comme un pagineur et les notes sont affichées.

git --no-pager log [--notes|--show-notes] ne montrera pas les notes.

git --no-pager log --notes | less affichera des notes.

git --no-pager log --notes | less | cat wont.

git log --notes > gitlog.txt fonctionne, mais j'essaie d'éviter de gérer les fichiers.

cat <(git log --notes) ne montrera pas, mais utilise un fichier temporaire

less -f <(git log --notes --oneline) montrera.

git log 1>&2 | cat 2>&1 | cat vient d'ouvrir moins encore.

git log 2>&1 | cat ne fonctionne pas

git log 2>&1 | cat 1>&2 | cat ne fonctionne pas


Aide Je suis si confus, quelle magie noire est à l'origine une partie des données que je veux être abandonné, mais apparemment seulement à l'heure d'affichage?

P.S. Si vous êtes contrarié par l'utilisation inutile des chats, imaginez un filtre perl/sed/grep/awk, en fin de compte, j'essaye de supprimer des nouvelles lignes pour que la valeur de la note ajoute les lignes du format git log --oneline.

+0

Avez-vous considéré des recherches séparées de 'git notes'? –

+0

bizarre, cette commande fonctionne pour moi: 'git --no-pager log --notes'. aussi, je crois que le '--notes' est là par défaut, que diriez-vous de la commande' git --no-pager log', ça marche? si non, que diriez-vous de 'GIT_PAGER = chat git log --notes' – odradek

+1

BTW,' cat <(git log --notes) '** ** ne crée pas réellement un fichier temp. Sur n'importe quel système d'exploitation moderne, il va évaluer quelque chose comme '/ dev/fd/12', qui est juste une référence à une entrée de table de descripteur de fichier - rien ne frappe le disque pour le créer. –

Répondre

1

Avec git 2.12.2, je suis entièrement incapable de reproduire le comportement (re: notes non imprimées) décrit dans la question.


Cela dit, ce qui suit effectue l'opération demandée et ne pas créer un fichier temporaire (sur un système où bash pourrait détecter le soutien /dev/fd ou /proc/self/fd au moment de la compilation), et génère la sortie d'une ligne avec des notes ajouté à chaque ligne les ayant:

#!/bin/bash 

in_note=0 
notes= 
last_line= 

while IFS= read -r line; do 
    if ((in_note == 0)) && [[ $line = "Notes:" ]]; then ## at the start of a note 
    in_note=1; continue 
    fi 
    if ((in_note == 0)); then       ## outside any note 
    [[ $last_line ]] && printf '%s\n' "$last_line" 
    last_line=$line 
    continue 
    fi 
    if [[ $line = "" ]]; then        ## at the end of a note 
    in_note=0 
    printf '%s|%s\n' "$last_line" "$notes" 
    last_line= 
    continue 
    fi 
    # all notes are prefixed by four spaces, so the below doesn't need extra spacing 
    notes+="$line"           ## inside of a note 
done < <(git log --oneline --notes) 
[[ $last_line ]] && printf '%s\n' "$last_line"