1

libgit2 でチェックアウトを使用して「git チェックアウト」を模倣したいのですが、失敗します。

  • APIドキュメントを読み、2つのメソッドを両方使用して2番目のパラメーターを設定しました。
  • test_checkout の例を読み、3 番目のパラメーターを に設定しましGIT_CHECKOUT_SAFE_CREATE たが、まだ機能しませんでした。
  • HEAD.git フォルダーには既にファイルがあります。

これを解決する方法???

コードの結果は次のとおりです。

2013-01-12 18:48:27.789 gitlib3[8661:907] git_repository_open ret:0 
2013-01-12 18:48:27.794 gitlib3[8661:907] get repository succeed.
2013-01-12 18:48:27.799 gitlib3[8661:907] count ret:1
2013-01-12 18:48:27.807 gitlib3[8661:907] git_checkout_index. ret:-9
2013-01-12 18:48:27.809 gitlib3[8661:907] err:Reference 'refs/heads/master' not found 

そしてコード自体:

(IBAction)Checkout:(id)sender {
    int ret = -1;
    git_repository *repo = NULL;
    NSArray *str = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docPath = [str objectAtIndex:0];
    NSString *localPath = [docPath stringByAppendingPathComponent:@"efg/.git"];
    ret = git_repository_open(&repo, [localPath UTF8String]);
    NSLog(@"git_repository_open ret:%d",ret);
    if(repo!=NULL)
    {
        NSLog(@"get repository succeed.");
    }
    git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
    opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE;

    /*git_index *index = NULL;
    git_repository_index(&index, repo);
    if((ret = git_index_entrycount(index)) > 0)
    {
        NSLog(@"count ret:%d", ret);
    }
    ret = git_checkout_index(repo, index, &opts);*/
    ret = git_checkout_index(repo, NULL, &opts);
    NSLog(@"git_checkout_index. ret:%d",ret);
    const git_error *err = giterr_last();
    if(err == NULL)
    {
        NSLog(@"NULL");
    }
    else
    {
        NSLog(@"err:%s", err->message);
    }
}
4

1 に答える 1

2

返されたエラー コード ( errors.h ヘッダーを参照) -9GIT_EORPHANEDHEAD、(HEAD がまだ存在しない参照を指している) ことを意味します。

孤立HEAD状態は、Git リポジトリにとって完全に有効な状態です。これは、たとえば、リポジトリが初期化された直後に発生します。ただし、git_checkout_index()新しい Git リポジトリから実行してもほとんど価値はありませんが、失敗することはありません。

確かに、Git は失敗しません

$ cd /tmp

$ mkdir so && cd so

$ git init .
Initialized empty Git repository in C:/Users/OneAmongMany/AppData/Local/Temp/so/.git/

$ git checkout-index

$

このエラーは、このコード行に起因する可能性があると思われます。

本当に新しい git リポジトリをチェックアウトしようとしているのであれば、libgit2 issue trackerで問題を作成することをお勧めします。そうでない場合は、質問を強化して背景情報を追加してください。

アップデート

この問題はlibgit2 リポジトリで修正されました。報告してくれてありがとう!

于 2013-01-12T12:26:10.530 に答える