git grep é armazenado em buffer. Por quê?

1

Eu corro git grep pela primeira vez em uma grande árvore (o kernel do Linux).

Isso leva muito tempo para ser executado. Se eu cancelar com ctrl + C antes de terminar, geralmente mostra imediatamente uma linha que encontrou.

Por que git grep não mostrou a linha imediatamente, quando a encontrou?

$ rpm -q git
git-2.17.2-1.fc28.x86_64
    
por sourcejedi 23.10.2018 / 11:17

2 respostas

4

git grep output é armazenado em buffer por less . (Na maioria dos casos, pode ser alterado usando várias opções de configuração, se for necessário).

O motivo pelo qual eu não notei isso é que git grep não mostra o rodapé do pager less quando há menos de uma tela de saída. No entanto, a saída ainda está em buffer. (Eu posso ver que less está sendo executado, abrindo outro terminal e executando ps -ax ).

    
por 23.10.2018 / 11:32
2

Na realidade, verificar fontes, git saída não é armazenada em buffer por menos o tempo todo.

Verificando o pager.c, ele mostra que a saída git é armazenada em buffer pelo programa apontado para a variável de shell PAGER; se não for definido, menos será usado por omissão.

Mais interessante ainda, enquanto menos saída está sendo paginada, ela define a variável shell GIT_PAGER_IN_USE como true. Ao invocar o pager, ele verifica essa variável.

Por uma questão de estranheza, parece que ele não gosta de cat como um pager, se detectá-lo, ele é apagado.

#ifndef DEFAULT_PAGER
#define DEFAULT_PAGER "less"
#endif
....

void setup_pager(void)
{
    const char *pager = git_pager(isatty(1));

    if (!pager)
        return;

    /*
     * After we redirect standard output, we won't be able to use an ioctl
     * to get the terminal size. Let's grab it now, and then set $COLUMNS
     * to communicate it to any sub-processes.
     */
    {
        char buf[64];
        xsnprintf(buf, sizeof(buf), "%d", term_columns());
        setenv("COLUMNS", buf, 0);
    }

    setenv("GIT_PAGER_IN_USE", "true", 1);

    /* spawn the pager */
    prepare_pager_args(&pager_process, pager);
    pager_process.in = -1;
    argv_array_push(&pager_process.env_array, "GIT_PAGER_IN_USE");
    if (start_command(&pager_process))
        return;

    /* original process continues, but writes to the pipe */
    dup2(pager_process.in, 1);
    if (isatty(2))
        dup2(pager_process.in, 2);
    close(pager_process.in);

    /* this makes sure that the parent terminates after the pager */
    sigchain_push_common(wait_for_pager_signal);
    atexit(wait_for_pager_atexit);
}
    
por 23.10.2018 / 14:54

Tags