./git/internals/internal-vs-external-commands.txt

download original
(git.c)

int main(int argc, const char **argv)  //argv = {"git", [global options...], "command", options...}
     
  => static int run_argv(int *argcp, const char ***argv)  //*argv = {"command", options...}
     {
         [...]
         while (1) {
             /* See if it's an internal command */
             handle_internal_command(*argcp, *argv);  //exits if successful
             [...]
             /* .. then try the external ones */
             execv_dashed_external(*argv);  //exits if successful
             [...]
         }
         [...]
     }

		handle_internal_command(*argcp, *argv);

          => run_builtin(p, argc, argv)  //struct cmd_struct p, z.B. { name: "add", fn: cmd_add, options: RUN_SETUP | NEED_WORK_TREE }
              
              => p->fnfn(argc, argv, <name of CWD relative to worktree root, if any>)

		------

        execv_dashed_external(*argv);

          => {
               argv[0] = "git-" + argv[0];
               run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE | RUN_CLEAN_ON_EXIT);
                 => run (fork/exec+wait)  {"git-command", options...} with git's installation directory up front in $PATH
             }

  
back to internals

(C) 1998-2017 Olaf Klischat <olaf.klischat@gmail.com>