git grep 출력이 버퍼링됩니다. 왜?

git grep 출력이 버퍼링됩니다. 왜?

git grep큰 트리(Linux 커널)에서 처음으로 실행했습니다 .

실행하는 데 시간이 오래 걸립니다. Ctrl+C로 끝내기 전에 취소하면 일반적으로 찾은 줄이 바로 표시됩니다.

git grep라인을 찾았을 때 라인을 즉시 표시하지 않는 이유는 무엇입니까?


$ rpm -q git
git-2.17.2-1.fc28.x86_64

답변1

git grep출력이 버퍼링됩니다 less. (대부분의 경우 원하는 경우 다양한 구성 옵션을 사용하여 변경할 수 있습니다.)

이것을 눈치채지 못한 이유는 git grep출력이 한 화면 미만일 때 페이지 바닥글이 표시되지 않기 때문입니다. less그러나 출력은 여전히 ​​버퍼링되어 있습니다. ( less다른 터미널을 열고 실행하면 실행되는 것을 볼 수 있습니다 ps -ax).

답변2

실제로 소스 코드를 확인해보면 git 출력이 항상 less로 버퍼링되는 것은 아닙니다.

pager.c를 살펴보면 PAGER 쉘 변수를 가리키는 프로그램에 의해 git 출력이 버퍼링되는 것을 알 수 있습니다. 정의되지 않은 경우 생략됩니다.

더 흥미롭게도 더 적은 출력이 페이징되면 쉘 GIT_PAGER_IN_USE 변수가 true로 설정됩니다. 호출기가 호출되면 이 변수를 확인합니다.

이상하게도 삐삐가 되는 걸 별로 안 좋아하는 것 같고 cat, 감지하면 지워준다.

#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);
}

관련 정보