Git 的入口点是什么?

4

我正在浏览git源代码,我想知道入口文件在哪里?我已经浏览了几个文件,但没有找到主函数。


1
任何C程序的入口点是什么? - Jonathon Reinhart
虽然我对C语言还很新,但我认为它可以是任何带有主函数的文件。如果不是这样,请告诉我。 - m..
@larsks 我会尝试的,谢谢。 - m..
1
你可能需要查看git.c文件,函数cmd_main(第644行)似乎在调用链中很早。(注意:我没有本地源代码副本,所以我是在线浏览存储库的)。此外,您可以从存储库的顶层执行递归grep(grep -rne 'main')。 - thurizas
2个回答

6

我可能错了,但我相信入口点在common-main.c文件中的main()函数。

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 中定义。


0

也许最好澄清一下误解。Git 是一种收集、记录和归档项目目录更改的方式。这是版本控制系统的目的,而 Git 可能是其中较为知名的一个。

有时它们还提供构建自动化,但通常最好的工具专注于最少的职责。在 Git 的情况下,它主要关注提交到存储库以保留初始化目录的不同状态。它不会构建程序,因此入口点不受影响。


对于 C 项目,入口点将始终是由编译器定义的相同函数。通常这个函数被称为 main,但也有重新定义或隐藏此入口点的方法。例如,Arduino 使用 setup 作为入口点,然后调用 loop@larks 留下的评论是一种在不确定时查找入口点的简单方法。从 git 存储库的根目录开始进行简单的递归搜索,可以在任何包含的文件中查找单词 main
grep main *.c

Windows的等效命令是FINDSTR,但最近更新的Windows 10大大提高了与Bash命令的兼容性。我正在运行的版本中可以使用grep。同样可以使用ls,尽管我不确定它是否一直存在。


一些 Git 项目包括多种语言,许多与 C(及其前身)相关的语言使用相同的入口点名称。仅查找文件扩展名为 .c 是找到 C 组件入口点的好方法,前提是代码具有足够高的质量以使您想要首先运行它。
确实有一些方法可以干扰扩展名过滤其他语言的程度,但这样做意味着非常杂乱无章的编码实践。

到目前为止最佳答案! - Marco
这似乎并没有回答这个问题(在我看来)。我认为楼主正在寻找_git本身_的入口点... - Dan Lowe
@DanLowe 或许你是正确的,但这个答案对于这个问题以及其他更一般的问题都非常相关。唯一的区别在于需要确定构建系统、它从哪个目录调用以及是否会干扰入口点。在大多数情况下,找到 main 就足够了。 - Aaron3468

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接