我想使用libgit2中的签出来模拟"git签出“,但是它失败了:
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);
}
}
发布于 2013-01-12 04:26:10
返回的错误代码(参见错误标头) -9表示GIT_EORPHANEDHEAD
(头指向一个尚未存在的引用)。
孤立的HEAD
是Git存储库的一个完全有效的状态。例如,在初始化了存储库之后就会发生这种情况。但是,从新的Git存储库执行git_checkout_index()
几乎没有什么价值,但不应该失败。
的确,吉特不会失败
$ 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问题跟踪器中创建一个问题。如果不是这样,请加强你的问题,以补充更多的背景资料。
更新
已经修好了存储库中的问题。谢谢你的报告!
https://stackoverflow.com/questions/14292860
复制