В C ++ с использованием libgit2 я хотел бы создать новый локальный репозиторий, в котором его ветвь master
основана на specific-branch
из другого локального репозитория, сохраняя его историю, чтобы впоследствии я мог синхронизироваться между ними.
По сути, я пытаюсь сделать следующее, за исключением использования libgit2:
https://stackoverflow.com/a/9529847/1019385
Так что, если бы у меня были файлы, расположенные следующим образом:
./old.git [ветви: главная, определенная ветка]
. / old / * [файлы и клон ./old.git в определенной ветке]
Гдекоманды будут выглядеть примерно так:
git init --bare ./new.git
cd ./old
git push ./new.git +specific-branch:master
И придумать что-то вроде (удалена проверка ошибок для уменьшения кода):
git_libgit2_init();
git_repository* repo = nullptr;
git_repository_init(&repo, "./new.git", true);
git_remote_create(&remote, repo, "origin", "./new.git");
git_remote_add_push(repo, "origin", "+specific-branch:master");
git_push_options optionsPush = GIT_PUSH_OPTIONS_INIT;
git_remote_push(remote, nullptr, &optionsPush);
Что я не совсем уверен, так это куда идтиотсюда и как правильно вызывать git_remote_push()
там, где он действительно что-то делает.Это в настоящее время не имеет побочных эффектов, так как на ./old.git
нет ссылок.Таким образом, ./new.git
создан правильно, но он не содержит содержимого ./old.git
/ ./old/*
.
Справка высоко ценится.
На основе ответа на вопросподход "извлечения", я также попытался сделать следующее:
git_repository* repo = nullptr;
if (git_repository_init(&repo, "./new.git", true)) {
FATAL();
}
git_remote* remote;
git_remote_create_anonymous(&remote, repo, "./old");
char* specs[] = { _strdup("specific-branch:master"), nullptr };
git_strarray refspecs;
refspecs.count = 1;
refspecs.strings = specs;
if (git_remote_download(remote, &refspecs, NULL)) {
FATAL();
}
Это все еще не имеет никакого эффекта.