- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用旧版本的 libgit2(没有 checkout.h)实现类似 checkout 的功能。
首先,我在分支 A 上,它看起来像:
Branch:
A A0 --- A1
/
Master M
每次提交都会创建一个同名文件,例如,标记为 A1 的提交会创建一个文件 A1。如果此时我查看 gitk,一切看起来都完全符合我的要求。
现在我创建一个新分支,B
,我想添加一个 promise :
Branch:
A A0 --- A1
/
Master M
\
B B0
但是,当我使用我的代码“ checkout ”B 时,它使 A0 和 A1 未被跟踪,而不是像我期望的那样删除它们:
(B)$ git status
# On branch B
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# A0
# A1
nothing added to commit but untracked files present (use "git add" to track)
因此,我认为我的 checkout 代码中缺少某些内容,即:
void Checkout(const char *branch_name, git_commit *branch_tip) {
// Update index & tree
git_tree *tree;
git_commit_tree(&tree, branch_tip);
git_index_read_tree(index_, tree);
git_index_write(index_);
git_tree_free(tree);
// Reset head
string branch_ref = string("refs/heads/") + branch_name;
git_reference *head;
git_reference_lookup(&head, repo_, kGitHeadFile);
git_reference_set_target(head, branch_ref.c_str());
git_reference_free(head);
}
(请注意,我实际上正在检查真实代码中的每一行的返回码,并且所有内容都返回 0,只是不想把这里的事情搞得一团糟。)
据我所知,此代码与 git 文档描述的内容相匹配 git checkout <branch>
:
To prepare for working on <branch>, switch to it by updating
the index and the files in the working tree, and by pointing
HEAD at the branch.
我需要运行一些...“更新工作树”命令吗?
最佳答案
如果你必须自己写这个,你可以看看libgit2中现有实现使用的基本策略。让我们考虑实现强制 check out (即忽略工作目录中的任何修改文件),因为这是一个简单得多的情况。
您没有提到您的 libgit2 有多旧。假设您可以访问 diff 功能,我将编写以下内容,我什至会使用一些更新的访问器函数来获取 diff 数据。如果这些访问器函数在您的版本中不可用,您可能需要重新设计以使用回调函数。我相信,如果核心差异功能不可用,那么您的 libgit2 太旧了,无法用于此目的。
您需要考虑您来自的旧 HEAD 和您要移动到的新 HEAD,以便了解哪些文件将被删除(相对于工作目录中未跟踪的文件)。在 libgit2 中最简单的事情是这样的:
git_diff_list *diff;
git_diff_delta *delta;
git_blob *blob;
size_t i;
FILE *fp;
git_diff_tree_to_tree(&diff, repo, from_tree, to_tree, NULL);
for (i = 0; i < git_diff_num_deltas(diff); ++i) {
git_diff_get_patch(NULL, &delta, diff, i);
switch (delta->status) {
case GIT_DELTA_ADDED:
case GIT_DELTA_MODIFIED:
/* file was added or modified between the two commits */
git_blob_lookup(&blob, repo, &delta->new_file.oid);
fp = fopen(delta->new_file.path, "w");
fwrite(git_blob_rawdata(blob), git_blob_rawsize(blob), 1, fp);
fclose(fp);
git_blob_free(blob);
break;
case GIT_DELTA_DELETED:
/* file was removed between the two commits */
unlink(delta->old_file.path);
break;
default:
/* no change required */
}
}
git_diff_list_free(diff);
/* now update the index with the tree we just wrote out */
git_index_read_tree(index, to_tree);
git_index_write(index);
/* and do the other stuff you have to update the HEAD */
上面的实际代码有很多问题需要您解决:
delta->new_file.path
和delta->old_file.path
中的路径是相对于版本库的工作目录,而不是当前工作目录进程,因此打开和取消链接文件的调用需要相应地调整路径根据您的用例,也许可以忽略类型更改(即变成 blob 的目录等)并且模拟 --force
可能是可以接受的。如果没有,那么这真的开始变成大量代码。
关于git - 使用 libgit2 checkout 分支时如何更新工作树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19034971/
当我这样做时 git checkout origin/bugfix/NTP-183-datefns git 显示 Note: checking out 'origin/bugfix/NTP-183-d
我刚收到一封来自 Google 的电子邮件,通知我他们将关闭 Google Checkout,我应该改用 Google 电子钱包。这让我感到困惑,因为我在 6 个月前开始使用 Google 数字商品购
SVN 仓库看起来像这样: 最佳/ 最佳 顶部/两个 前/三 ...等等 您不想结帐整个 顶部 文件夹,但您不知道 SVN's sparse checkout feature . 所以你 checko
在稀疏 checkout 场景中,命令 git checkout . 恢复应该忽略的目录。这是设计使然,还是 Git 中的潜在问题?我正在使用 git checkout . 放弃我对我的工作副本所做的
新手问题,我想确保我理解这一点。 当我 git checkout ,这会将整个项目返回到当时的状态,还是仅重新创建在该特定修订版中更改的文件? 例如:如果我的文件夹除了 .git 存储库之外完全是空
我正在使用 Stripe 支付与我的系统集成。但是我不明白这两个库之间的区别。 似乎使用 javascript 生成表单并将 token 传递到我们的服务器端。 这是与 .net 核心一起使用
我正在使用 GitHub Actions 和安装在 Windows 2019 服务器上的自托管代理设置 CI/CD 管道。 我面临的问题是操作 actions/checkout@v2 无法 check
有时是 git checkout命令给出进度反馈: $ git checkout develop Checking out files: 100% (10779/10779), done. Switc
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我有一个我喜欢的 checkout 后 Hook - 大多数时候 - 但有时我知道运行它会浪费时间,或者,因为它会删除并重建我的开发数据库,所以我不'希望它做它的事情。 是否有跳过钩子(Hook)
这个问题在这里已经有了答案: Why do we use double dash in "git checkout -- ."? [duplicate] (1 个回答) 关闭 5 年前。 我总是使用
我尝试 checkin 有关我的开发的 excel 文档。但是我的构建失败了,因为它的文件被我锁定了。但问题是;当我选择解锁文档时,出现以下错误。 > The item $/../../Device
通过 XML API,如何将 Google Checkout 回调序列号与原始订单相关联? 在同一行 - XML API doc 的“选项 B - 提交服务器到服务器结帐 API 请求”部分中的序列号
我想确保没有其他人正在检查源代码,以便我可以制作发布的安装程序。所以,我想看看 1) #1正在 check out 特定文件的用户列表和 2) #2所有 checkout 文件的列表;但我不知道该怎么
我正在使用 Google Checkout 制作购物车。我已经像下面这样集成了 Paypal: " /
tl;dr JGit 的 checkout 抛出异常,而命令行 git checkout 工作正常 我目前正在尝试使用 JGit 从在线 Git 存储库中检查某些修订版,使用 Java(用于工作)。我
在使用“git checkout”时,我对这两个选项感到有点困惑 我总是使用 git checkout -- . 来清除我的工作目录。 但今天当我错误地输入 git checkout - . 时。我没
最近我使用了 Google Checkout a.k.a Google Wallet。我的任务是让它作为付款方式步骤中的选项单页结账。 我的 Mangento 版本是 CE 1.6.2.0 默认情况下
最近我使用了 Google Checkout a.k.a Google Wallet。我的任务是让它作为付款方式步骤中的选项单页结账。 我的 Mangento 版本是 CE 1.6.2.0 默认情况下
git checkout - check out 先前 check out 的提交引用。这些信息存储在哪里,是否有类似的方法来访问任何第 n 个以前 checkout 的提交? 我希望能够查看我已 c
我是一名优秀的程序员,十分优秀!