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