gpt4 book ai didi

objective-c - 克隆一个 git 仓库(深入)

转载 作者:太空狗 更新时间:2023-10-30 03:33:26 26 4
gpt4 key购买 nike

如何克隆一个 repo(使用 libgit2 )

我想做什么git clone确实,但有 libgit2 .我可能要问的是什么 git clone确实很深入。

这是我目前正在做的:

  1. 初始化一个repo
  2. 调整配置文件以添加远程
  3. 创建 git_remote
  4. 下载包文件
  5. 索引包文件并写入索引(给我们一个 .idx 文件)
  6. (编辑)将所有不同的分支写入磁盘。
  7. (编辑)做 git checkout以某种方式。

现在我不知道该怎么办了。我唯一的猜测是加载 .idxgit_index并使用 git_repository_set_index , 但也没有显示任何文件。

编辑

我测试了运行 git checkout master在半克隆的 repo 协议(protocol)上,这就完成了工作。现在我只需要找出如何使用 libgit2 来完成它,问题跟踪器中似乎有一些有用的信息。

编辑2

我现在将添加我当前的代码,希望有一天有人会发现它有用,希望成为我从未找到的快速入门代码。注意:我正在使用 Obj-CObjective-Git在这里,但它主要是普通的 c。

+ (GTRepository *)cloneFromRemoteURL:(NSURL *)remoteURL toLocalURL:(NSURL *)localURL
{
// Let's suppose the URL looks like: https://github.com/libgit2/libgit2.git
// Then we need to get a URL like this too: git://github.com/libgit2/libgit2.git
// This may be a bit dodgy, but it will do for now.
const char *gitURL = [remoteURL.absoluteString stringByReplacingOccurrencesOfString:@"https://github.com/" withString:@"git://github.com/"].UTF8String;

//Setup
int error;
git_repository *repo
git_config *cfg;
git_remote *remote;

NSURL *gitDirURL = [localURL URLByAppendingPathComponent:@".git"];

error = git_repository_open(&repo, gitDirURL.path.UTF8String);
if (error != GIT_SUCCESS) {

git_repository_init(&repo, gitDirURL.path.UTF8String, 1);

//Config
git_repository_config(&cfg, repo);
git_config_set_int32 (cfg, "core.repositoryformatversion", 0);
git_config_set_bool (cfg, "core.filemode", 1);
git_config_set_bool (cfg, "core.bare", 0);
git_config_set_bool (cfg, "core.logallrefupdates", 1);
git_config_set_bool (cfg, "core.ignorecase", 1);
git_config_set_string (cfg, "remote.origin.url", gitURL);
git_config_set_string (cfg, "remote.origin.fetch", "+refs/heads/*:refs/remotes/origin/*");
git_config_set_string (cfg, "branch.master.remote", "origin");
git_config_set_string (cfg, "branch.master.merge", "refs/heads/master");

git_repository_set_workdir(repo, localURL.path.UTF8String);

error = git_remote_new(&remote, repo, "A remote", gitURL, "origin");

git_repository_free(repo);
git_repository_open (&repo, localURL.path.UTF8String);
}



git_repository_config(&cfg, repo);

// connect to repo
error = git_remote_load(&remote, repo, "origin");

error = git_remote_connect(remote, GIT_DIR_FETCH);
// get pack file

git_off_t bytes;
git_indexer_stats stats;
error = git_remote_download(remote, &bytes, &stats);

NSURL *packFolderURL = [localURL URLByAppendingPathComponent:@".git/objects/pack"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *array = [fileManager contentsOfDirectoryAtURL:packFolderURL includingPropertiesForKeys:nil options:0 error:nil];
NSLog(@"Dictionary:%@",array);
NSString *result;
for (NSURL *url in array) {
if ([url.path rangeOfString:@".pack"].location != NSNotFound) {
result = url.path;
}
}
const char *packname = [result UTF8String];


// unpack pack file
if (packname != NULL)
{
git_indexer *indexer;
git_indexer_stats stats2;
int error;
char hash[GIT_OID_HEXSZ + 1] = {0};

error = git_indexer_new(&indexer, packname);
error = git_indexer_run(indexer, &stats2);
error = git_indexer_write(indexer);

// Get the packfile's hash (which should become it's filename)
git_oid_fmt(hash, git_indexer_hash(indexer));

NSString *hashStr = [NSString stringWithCString:hash encoding:NSUTF8StringEncoding];
hashStr = [NSString stringWithFormat:@"pack-%@.idx",hashStr];
const char *indexPath = [hashStr UTF8String];

puts(hash);
git_index *index;
git_index_open(&index, indexPath);
git_index_read(index);
git_repository_set_index(repo, index);


git_indexer_free(indexer);
git_remote_update_tips(remote, update_cb2); //No idea what it does, but it seems like it's important… It does make the branches appear in .git/refs/remotes/origin

}

//在这里做 git checkout master

return [GTRepository repositoryWithURL:localURL error:nil];

}

最佳答案

因为 libgit2 没有 explicitly mention git clone在其 issue list ,要遵循的一个线索是原始 git 项目的源代码:

最后一个脚本将指导您完成 git clone 的所有阶段。

关于objective-c - 克隆一个 git 仓库(深入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10642629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com