2013-08-01 1 views
7

J'ai un travail @daily dans crontab qui exécute git gc sur tous les repos. J'essaye de mettre en place un fichier journal pour le travail mais la redirection d'E/S ne produit pas les résultats que je recherche; Je reçois un fichier vide.Tentative de redirection de la sortie 'git gc'

J'ai fait tous les habituels >, 2>&1 et ainsi de suite sans succès. Quelqu'un m'a mentionné que git gc utilise ncurses pour ses procédures de sortie qui jette la sortie directement à la console, en contournant stdout/stderr (corrigez-moi si je me trompe ici). Est-ce que quelqu'un peut me diriger dans la bonne direction?

Répondre

6

Vous pouvez essayer ceci:

script -q -c 'git gc' > log

Ou ceci (avec une sortie plus lisible):

script -q -c 'git gc' | sed 's/\r.*//g' > log

12

Il n'utilise pas ncurses (programmes qui utilisent ncurses prend généralement plus l'écran entier).

Courir

strace -p -o git-gc.strace git gc 

montre que les messages de progression sont écrits à stderr (descripteur de fichier 2) - mais ils sont désactivés si stderr est pas un téléscripteur. Donc, si vous exécutez

git gc 2>some_file 

alors some_file sera vide, parce que git gc ne produit pas les messages de progrès.

En regardant le code source (builtin/gc.c), il y a une option quiet qui est définie par l'option de ligne de commande --quiet:

git gc --quiet 

Je n'ai pas trouvé le code qui se quietsur si stderr est pas un téléscripteur, mais je vois un code similaire ailleurs dans les sources git, telles que:

quiet = !isatty(2); 

Il n'y a aucune option de ligne de commande pour mettre le quiet option off.

Cela signifie que si vous voulez capturer la sortie de progression de git gc, vous devrez le convaincre qu'il s'exécute avec stderr dirigé vers un tty.

some guy's answer fournit un moyen de le faire. Cependant, étant donné que le code s'efforce de produire les messages de progression uniquement s'il écrit dans un terminal, vous pouvez décider si vous avez vraiment besoin de capturer ces messages. Ils ne sont pas conçus pour être sauvés, et ils pourraient ne pas être très utiles.

Si vous voulez examiner les sources git-vous (et, si vous êtes suffisamment motivé, les pirater pour forcer les messages de progrès à écrire):

git clone git://git.kernel.org/pub/scm/git/git.git 
Questions connexes