我正在浏览git源代码,我想知道入口点文件在哪里?我已经浏览了几个文件,我认为会是它,但找不到主要功能。
答案 0 :(得分:4)
我可能错了,但我相信main()
中的入口点为common-main.c
。
int main(int argc, const char **argv)
{
/*
* Always open file descriptors 0/1/2 to avoid clobbering files
* in die(). It also avoids messing up when the pipes are dup'ed
* onto stdin/stdout/stderr in the child processes we spawn.
*/
sanitize_stdfds();
git_setup_gettext();
git_extract_argv0_path(argv[0]);
restore_sigpipe_to_default();
return cmd_main(argc, argv);
}
最后,您可以看到它返回cmd_main(argc, argv)
。 cmd_main()
有很多定义,但我相信这里返回的是git.c
中定义的那个,这里有一点整整的发布,但摘录如下:
int cmd_main(int argc, const char **argv)
{
const char *cmd;
cmd = argv[0];
if (!cmd)
cmd = "git-help";
else {
const char *slash = find_last_dir_sep(cmd);
if (slash)
cmd = slash + 1;
}
/*
* "git-xxxx" is the same as "git xxxx", but we obviously:
*
* - cannot take flags in between the "git" and the "xxxx".
* - cannot execute it externally (since it would just do
* the same thing over again)
*
* So we just directly call the builtin handler, and die if
* that one cannot handle it.
*/
if (skip_prefix(cmd, "git-", &cmd)) {
argv[0] = cmd;
handle_builtin(argc, argv);
die("cannot handle %s as a builtin", cmd);
}
handle_builtin()
也在git.c
中定义。
答案 1 :(得分:0)
也许最好解决这个误解。 Git是一种收集,记录和归档项目目录更改的方法。这是版本控制系统的目的,而git可能是更容易识别的一种。
有时它们也提供构建自动化,但通常最好的工具集中在最少的职责上。在git的情况下,它主要关注对存储库的提交,以便保留它初始化的目录的不同状态。它不构建程序,因此入口点不受影响。
对于C项目,入口点将始终与编译器定义的入口点相同。通常,这是一个名为main
的函数,但有一些方法可以重新定义或隐藏此入口点。例如,Arduino使用setup
作为切入点,然后调用loop
。
@larks留下的评论是一种在您不确定时找到入口点的简便方法。使用git repo根目录中的简单递归搜索可以在任何包含的文件中搜索单词main
:
grep main *.c
Windows等效项为FINDSTR
,但最近对Windows 10的更新大大提高了与Bash命令的兼容性。 grep
可用于我正在运行的版本中。 ls
也是如此,但我不确定它是否一直存在。
一些git项目包含多种语言,与C(和前辈)相关的许多语言使用相同的入口点名称。仅查看.c
的文件扩展名是查找C组件入口点的好方法,假设代码质量足够高,您首先要运行它。
肯定有办法干扰扩展程序过滤其他语言的程度,但它们的使用意味着非常随意的编码实践。