Кажется, я не могу найти никаких примеров того, как это делается.
Я пытаюсь эмулировать команду: git clone --recurse-submodules <repo>
Можно ли даже включить субмодули при клонировании с использованием libgit2? Я не уверен в этом.
Вот мой код, который выполняет клонирование и работает, за исключением подмодулей.
int my_git_cred_cb(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload)
{
return git_cred_userpass_plaintext_new(cred, "user", "pass");
}
void checkout_progress(
const char *path,
size_t cur,
size_t tot,
void *payload)
{
progress_data *pd = (progress_data*)payload;
/* Do something with checkout progress */
}
int fetch_progress(
const git_transfer_progress *stats,
void *payload)
{
progress_data *pd = (progress_data*)payload;
int fetch_percent =
(100 * stats->received_objects) /
stats->total_objects;
int index_percent =
(100 * stats->indexed_objects) /
stats->total_objects;
int kbytes = stats->received_bytes / 1024;
printf("network %3d%% (%4d kb, %5d/%5d) /"
" index %3d%% (%5d/%5d)\n",
fetch_percent, kbytes,
stats->received_objects, stats->total_objects,
index_percent,
stats->indexed_objects, stats->total_objects);
if(stats->indexed_objects >= stats->total_objects) {
printf("COMPLETE=1\n");
COMPLETE = 1;
}
/* Do something with network transfer progress */
return 0;
}
int cloneRepo()
{
git_repository *repo = NULL;
progress_data d = {0};
git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT;
git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;
clone_opts.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE;
clone_opts.checkout_opts.progress_cb = checkout_progress;
clone_opts.checkout_opts.progress_payload = &d;
clone_opts.checkout_opts = checkout_opts;
clone_opts.fetch_opts.callbacks.transfer_progress = fetch_progress;
clone_opts.fetch_opts.callbacks.payload = &d;
clone_opts.fetch_opts.callbacks.credentials = my_git_cred_cb;
int error = git_repository_open_bare(&repo, repoDir);
if(error == -3)
{
//clone from github
int index = ui->selectTestPlans->currentIndex();
if(index)
{
std::cout << "Preparing to clone from ALL_TESTPLANS repo" << std::endl;
//clone ALL_TESTPLANS repo
error = git_clone(&repo, "repo.git", "dir/path", &clone_opts);
std::cout << "Error code: " << error << std::endl;
return 0;
}
}
}
Я просмотрел git_clone_options
и не могу найти ничего, касающегося включения подмодулей. Есть ли другая структура, которую я должен настроить для этого?