2016-06-30 10 views
2

libgit2 C APIを使用して2つのgitリポジトリ(repoとmoduleという名前)をコードに作成しましたが、リポジトリをサブポールとして "repo"リポジトリに追加します。私はこれを行うにはlibgit2 git_submodule_add_setup C APIを使用しようとしています。 https://libgit2.github.com/libgit2/#HEAD/group/submodule/git_submodule_add_setupを参照してください。libgit2を使用してスーパープロジェクトにgitサブモジュールを追加する方法

ドキュメント以下の言葉:

git_submodule_add_setup: これはフェッチおよびサブモジュールの内容のチェックアウトまでの「gitのサブモジュールを追加」ん。新しいサブモジュールを準備し、.gitmodulesにエントリを作成し、作業ディレクトリの指定されたパスに、または作業ディレクトリから新しいリポジトリへのgitlinkを持つ.git/modulesに空の初期化リポジトリを作成します。

"git submodule add"を完全にエミュレートするには、この関数を呼び出し、サブモジュールrepoを開き、必要に応じてクローンステップを実行します。最後に、git_submodule_add_finalize()を呼び出して、新しいサブモジュールと.gitモジュールを追加して、インデックスにコミットする準備をまとめます。

私の質問は、git_submodule_add_setupの呼び出しで、初期化された空のサブモジュール(その内部に.gitディレクトリを持つ)が作成されていることを前提にして、上記のクローン操作をどの程度正確に実行しますか?私はすでにgit_submodule_openとgit_cloneのC APIを使ってクローンを行ういくつかの試みを行ってきましたが、無駄です。サブモジュールが空のフォルダーではないため、クローンは失敗します。私はgit_clone C APIのドキュメントを読んで、https://libgit2.github.com/docs/guides/101-samples/#repositories_clone_simpleなどのサンプルコードに慣れてきましたが、私はまだ賢明ではありません。知っている人の助けを借りて大いに感謝します。

私はこれまでのものを味わうために、以下にコードスニペットを含めました。

namespace bfs = boost::filesystem; 
git_repository * repo = NULL; 
bfs::path const repo_path = bfs::current_path()/"repo"; 
std::string const repo_url = repo_path.string(); 
git_repository_init(&repo, repo_url.c_str(), 0); 

//Add various files to repo index, and commit them... 

git_repository * module = NULL; 
bfs::path const module_path = bfs::current_path()/"module"; 
std::string const module_url = module_path.string(); 
git_repository_init(&module, module_url.c_str(), 0); 

//Add various files to moduleindex, and commit them... 

git_submodule * submodule = NULL; 
git_submodule_add_setup(&submodule, repo, module_url.c_str(), "module", 0); 

//What do I need to do in here to clone the module into position?? 

git_submodule_add_finalize(submodule); 
git_submodule_free(submodule); 

git_repository_free(module); 
git_repository_free(repo); 
+0

私はひどく答えが必要です; –

答えて

0

サブモジュールの追加にも問題がありました。 ここは私のGithub issueです。

幸いにも、貢献者が私にこの実例を教えてくれました。

#include <git2.h> 
#include <assert.h> 
#include <stdio.h> 

static int just_return_origin(git_remote **out, git_repository *repo, const char *name, const char *url, void *payload) 
{ 
    return git_remote_lookup(out, repo, name); 
} 

static int just_return_repo(git_repository **out, const char *path, int bare, void *payload) 
{ 
    git_submodule *sm = payload; 
    return git_submodule_open(out, sm); 
} 

int main(int argc, char *argv[]) 
{ 
    git_clone_options opts = GIT_CLONE_OPTIONS_INIT; 
    git_submodule *sm; 
    git_repository *parent, *child; 
    int result = 0; 

    git_libgit2_init(); 

    result = git_repository_open(&parent, "parent"); 
    assert(!result); 

    assert(!git_submodule_add_setup(&sm, parent, "file:///tmp/sm/child", "sm_test", 1)); 

    opts.repository_cb = just_return_repo; 
    opts.repository_cb_payload = sm; 
    opts.remote_cb = just_return_origin; 
    opts.remote_cb_payload = sm; 

    assert(!git_clone(&child, "file:///tmp/sm/child", "sm_test", &opts)); 
    assert(!git_submodule_add_finalize(sm)); 

    git_submodule_free(sm); 
    git_repository_free(child); 
    git_repository_free(parent); 
    git_libgit2_shutdown(); 

    return 0; 
} 

この例はあなたにも役立ちます(この質問はかなり古いですが)。

関連する問題