Git源代码学习

因公司内部业务场景,需要修改部分源代码以及开发相关hook,这里简单记录下主要的过程


源代码地址和版本

https://github.com/git/git

当前我看的是v2.18.0版本


IDE工具:

VIM,VSCode,SourceInsight


编译方法:

主要参考https://github.com/git/git/blob/master/INSTALL

在ubuntu.centos上编译,我就修改了路径,即make prefix=/usr && make prefix=/usr install 即编译完成,依赖的包都很常见,轻松搞定


记录日志:

git中默认有trace的方法,直接使用即可,这样就可以在关键地方记录日志查看代码的运行

1.#include "trace.h"
2.定义环境变量为绝对路径,如export MADIXIN_LOG="/git.log"
3.增加代码,输出日志
  setenv("MADIXIN_LOG", "/git.log", 1);
  struct trace_key key={"MADIXIN_LOG",0,0,1};
  char *log = "world cup\n";

  trace_verbatim(&key,log,strlen(log));


GDB调试:

gdb     #启动gdb
file git    #设置启动git命令
run receive-pack --omega /home/git/mnt/be/repositories/02/00/00/2/2.git  #启动并传入参数
b cmd_receive_pack      #在cmd_receive_pack函数打断点
s(step)  #跳入函数   
finish #跳出函数
continue #跳到下一个断点
n(next)  #执行下一行
p xx #打印变量xx

watch xx   #监控变量xx


Git主要代码结构

1.安装好之后,执行 git --exec-path 会看到一个目录,这个目录下会看到100多个可执行文件,这些文件就是 git 的子命令。

2.git 的入口是 common-main.c ,这个里面有一个 main 函数,是入口

然后是 git.c 里面的 cmd_main 函数。这个函数会调用 handle_builtin ,对于每个子命令,直接呼叫这个文件里面结构体 static struct cmd_struct commands[] 定义的子命令处理方法(函数指针)。

3.如果是新增git xxx命令,则不需要修改源代码。git发现commands不包含xxx命令时,则会去执行PATH路径下的git-xx的外部命令。因此我们如果只想新增新增git xxx命令时,只需要独立开发一个git-xxx可执行文件,安装到PATH目录下即可。





你可能感兴趣的:(技术点/工具)