최초 시점 확인할 때 유용한 커맨드
git log --author-date-order --reverse --all -G "함수명" -p 파일경로
풀 로그
git log -L :"함수명":"파일경로"
--author-date-order --reverse 옵션은 최초 부터 확인할때 좋음
--no-pager 옵션을 주면 less 형태로 출력안되고 직빵 stdout 으로 찍힘
예제에서 확인하세용
다양한 예제
파일로 뽑기
git --no-pager log --author-date-order --reverse --all -G "exception_svc_test" -p kernel.c > ~/history.txt
풀 히스토리
git log -G "exception_svc_test" -L :exception_svc_test:kernel.c
커밋 메시지 제외 & 짧은 해쉬 커밋 코드만 보기
git log -G "exception_svc_test" -L :exception_svc_test:kernel.c --pretty=format:%h
레포지토리 URL 뽑기
git ls-remote --get-url
변경에 해당하는 라인의 해쉬 뽑아내기
git blame 파일경로 -L줄번호,줄번호
커밋 라인 웹페이지 url 뽑기
git ls-remote --get-url | echo $(awk '{ print substr( $0, 0, length($0)-4 ) }')/commit/$(git blame 파일경로 -L줄번호,줄번호 | awk '{ print $1 }')
예제
커밋 라인 웹 URL 뽑기 예시
git ls-remote --get-url | echo $(awk '{ print substr( $0, 0, length($0)-4 ) }')/commit/$(git blame kernel.c -L15,15 | awk '{ print $1 }')
해당 시점의 레포지토리 보기
git ls-remote --get-url | echo $(awk '{ print substr( $0, 0, length($0)-4 ) }')/tree/$(git blame kernel.c -L15,15 | awk '{ print $1 }')
다른 꿀팁 있으면 댓글로 공유해요~
좋은 커널 스터디 되세요 ㅎㅎ
.
grep 보다 강력한 git grep
:~/linux$ git grep -n -B 4 -A 4 kthread_create_info
# 키워드 매칭 이전 (-B) 다음 (-A) 라인 갯수
# 디폴트 논리 코어 개수 최대의 스레드로 서칭함
kernel/kthread.c-34-static DEFINE_SPINLOCK(kthread_create_lock);
kernel/kthread.c-35-static LIST_HEAD(kthread_create_list);
kernel/kthread.c-36-struct task_struct *kthreadd_task;
kernel/kthread.c-37-
kernel/kthread.c:38:struct kthread_create_info
kernel/kthread.c-39-{
kernel/kthread.c-40- /* Information passed to kthread() from kthreadd. */
kernel/kthread.c-41- int (*threadfn)(void *data);
kernel/kthread.c-42- void *data;
--
kernel/kthread.c-243-
kernel/kthread.c-244-static int kthread(void *_create)
kernel/kthread.c-245-{
kernel/kthread.c-246- /* Copy data: it's on kthread's stack */
kernel/kthread.c:247: struct kthread_create_info *create = _create;
kernel/kthread.c-248- int (*threadfn)(void *data) = create->threadfn;
kernel/kthread.c-249- void *data = create->data;
kernel/kthread.c-250- struct completion *done;
kernel/kthread.c-251- struct kthread *self;
--
kernel/kthread.c-303-#endif
kernel/kthread.c-304- return NUMA_NO_NODE;
kernel/kthread.c-305-}
kernel/kthread.c-306-
kernel/kthread.c:307:static void create_kthread(struct kthread_create_info *create)
kernel/kthread.c-308-{
kernel/kthread.c-309- int pid;
kernel/kthread.c-310-
kernel/kthread.c-311-#ifdef CONFIG_NUMA
--
kernel/kthread.c-333- va_list args)
kernel/kthread.c-334-{
kernel/kthread.c-335- DECLARE_COMPLETION_ONSTACK(done);
kernel/kthread.c-336- struct task_struct *task;
kernel/kthread.c:337: struct kthread_create_info *create = kmalloc(sizeof(*create),
kernel/kthread.c-338- GFP_KERNEL);
kernel/kthread.c-339-
kernel/kthread.c-340- if (!create)
kernel/kthread.c-341- return ERR_PTR(-ENOMEM);
--
kernel/kthread.c-647- __set_current_state(TASK_RUNNING);
kernel/kthread.c-648-
kernel/kthread.c-649- spin_lock(&kthread_create_lock);
kernel/kthread.c-650- while (!list_empty(&kthread_create_list)) {
kernel/kthread.c:651: struct kthread_create_info *create;
kernel/kthread.c-652-
kernel/kthread.c-653- create = list_entry(kthread_create_list.next,
kernel/kthread.c:654: struct kthread_create_info, list);
kernel/kthread.c-655- list_del_init(&create->list);
kernel/kthread.c-656- spin_unlock(&kthread_create_lock);
kernel/kthread.c-657-
kernel/kthread.c-658- create_kthread(create);