我没有找到任何关于获取两个文件之间差异的文档。我使用下面的代码使用坚固的方式提交文件
@repo=Rugged::Repository.new($reponame)
@sha=@repo.write('D:\Ruby\MyGitRepo\file1.txt','blob')
puts @sha
commit = @repo.lookup(@sha)
Run Code Online (Sandbox Code Playgroud)
如何在崎岖中看到同一对象的两次提交之间的差异?
我正在尝试使用 pygit2 实现一些“瓷器”命令。似乎我在实施拉动时遇到了一些障碍。特别是最简单的拉动情况,快进。
设置:
我有两个 git 仓库。一个“远程”和一个“本地”。我在远程仓库上进行一次提交,然后使用 pygit2 的clone_repository(). 我在遥控器上进行了后续提交,然后尝试运行pull()下面概述的功能。
我的实现:
def pull(repo, remote_name='origin'):
for remote in repo.remotes:
if remote.name == remote_name:
remote.fetch()
remote_master_id = repo.lookup_reference('refs/remotes/origin/master').target
merge_result, _ = repo.merge_analysis(remote_master_id)
# Up to date, do nothing
if merge_result & pygit2.GIT_MERGE_ANALYSIS_UP_TO_DATE:
return
# We can just fastforward
elif merge_result & pygit2.GIT_MERGE_ANALYSIS_FASTFORWARD:
print repo.head.target
print repo.status()
master_ref = repo.lookup_reference('refs/heads/master')
master_ref.set_target(remote_master_id)
repo.head.set_target(master_ref)
repo.checkout_head()
print repo.status()
elif merge_result & pygit2.GIT_MERGE_ANALYSIS_NORMAL:
repo.merge(remote_master_id)
print repo.index.conflicts
assert repo.index.conflicts is None, 'Conflicts, ahhhh!'
user …Run Code Online (Sandbox Code Playgroud) 我正在使用 libgit2 v0.23.0 库进行 git pull 和提交操作。我正在调用git_merge(repo,their_heads,1,&merge_opt,&checkout_opts);方法,它工作正常并将更改从远程存储库合并到本地存储库。但是之后,当我调用git_commit_create()方法时,它会抛出错误failed to create commit: current Tip is not the first Parent ,错误代码为-15。
我调查并发现 FETCH_HEAD 和 MERGE_HEAD 文件包含更新的 oid,但 ORIG_HEAD 仍然包含以前/过时的 oid。我不确定这是我在 git_commit_create() 期间遇到的错误的原因。
int fetch()
{
qDebug()<<"Fetch";
git_remote *remote = NULL;
const git_transfer_progress *stats;
struct dl_data data;
git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT;
git_repository *repo = NULL;
QString repoPath = "repopath/.git";
int error = git_repository_open(&repo, repoPath.toStdString().c_str());
if (git_remote_lookup(&remote, repo, "origin") < 0) {
if (git_remote_create_anonymous(&remote, repo,"repoURL") < 0) …Run Code Online (Sandbox Code Playgroud) 我想知道如何使用 C-API 在 Git 中的两个标签之间找到所有提交?我知道这可以使用 CLI 工具轻松完成:
git log [第一次提交]..[第二次提交] --pretty=oneline
但是,我似乎无法弄清楚如何使用 C API 来做到这一点。我遇到的问题是图中最终出现了一个循环。
这是我在 Objective-Git 中使用的一些 Objective-C 代码,但是由于大多数人不了解 Objective-C,我很高兴在 C API 或其他一些 Git API 中得到答案。我想我必须保留以前遍历的提交或其他内容的字典?
- (void)traverseCommits: (GTCommit *)start withGoal: (GTCommit *)goal withHistory: (NSMutableDictionary *)history{
NSLog(@"%@", start.shortSHA);
if ([start.SHA isEqualToString:goal.SHA]) {
return;
}
for (GTCommit *c in start.parents) {
//[history setObject:c forKey:c.SHA];
if(![c.SHA isEqualToString:goal.SHA])
[self traverseCommits:c withGoal:goal withHistory:history];
}
}
Run Code Online (Sandbox Code Playgroud) 我需要初始化一个git存储库并获取最新版本的分支.在bash中,命令是:
git init
git remote add -t $BRANCH -f origin $REMOTE
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用libgit2以编程方式执行相同操作,但是在查找第二行的等效项时遇到了问题.创建远程的调用是显而易见的,但我没有看到任何将它添加到存储库或处理分支.
用libgit2可以做到这一点吗?如果没有,是否有能够这样做的图书馆?
这个问题是我上一个问题的演变或解决方案:克隆一个git repo(深入)我认为在这种情况下创建一个新问题是最好的事情,但我可能错了.
这个很简单:我将如何git checkout master使用libgit2做一些相同的事情
这似乎是一年前不可能的:https://github.com/libgit2/libgit2/issues/247
据此,至少5个月前克隆是可能的.但我从未见过有关如何操作的任何代码,文档或示例.(编辑)我的意思是我没有看到任何关于包含的完整克隆git checkout,也没有关于结帐的任何代码/文档.
我做了一个提交(49916 .....)现在我想将一个提交文件签出到工作目录中.该文件名为NEW.txt.如果我输入
Git checkout 49916 NEW.txt
进入Git Bash它会创建带有我工作目录内容的NEW.txt文件.
但我的LibGit2Sharp命令不想工作.我究竟做错了什么?
var repo = new Repository(repopath);
var checkoutPaths = new[] { "NEW.txt"};
repo.CheckoutPaths("49916", checkoutPaths);
Run Code Online (Sandbox Code Playgroud)
我读了每篇关于checkoutpaths函数的文章.但是我无法让它发挥作用.我从LibGit2Sharp结帐测试文件中获取了该函数.
repo.CheckoutPaths(checkoutFrom, new[] { path });
Run Code Online (Sandbox Code Playgroud) 在Visual Studio 2013中从GitHub中提取我的存储库时:
发生错误.详细消息:libgit2引发了一个错误.类别= 20(错误).FETCH_HEAD第2行中的描述无效
从命令行,git pull并git push说一切都是最新的,正常.
以下是生成此错误消息的libgit2源代码:http://cpansearch.perl.org/src/ALEXBIO/Git-Raw-0.27/xs/libgit2/src/fetchhead.c
通常当你在git仓库中运行这样的东西时:
git checkout abc1234
Run Code Online (Sandbox Code Playgroud)
你最终处于一个独立的HEAD状态.如果你运行git branch,输出将如下所示:
* (detached from abc1234)
master
Run Code Online (Sandbox Code Playgroud)
这是很好的预期行为.
我最近一直在玩pygit2,并且遇到过我以前没见过的东西.假设我做了以下事情:
repo = pygit2.discover_repository("/path/to/repo")
repo.head = "abc1234"
Run Code Online (Sandbox Code Playgroud)
我希望存储库处于独立的HEAD状态.出于所有意图和目的,我相信它是在这样做之后.但是,输出git branch看起来有点不同:
* (no branch)
master
Run Code Online (Sandbox Code Playgroud)
有谁知道有什么区别,为什么会有差异,这意味着什么?
编辑:
下面是使用pygit2克隆存储库后的reflog,为repo.head分配提交SHA1哈希,然后运行git checkout master,然后运行git checkout myhash:
69df316 HEAD@{0}: checkout: moving from master to 69df3161f315e9b13ba4bd811635c11f67616598
d6ece61 HEAD@{1}: checkout: moving from 69df3161f315e9b13ba4bd811635c11f67616598 to master
69df316 HEAD@{2}:
d6ece61 HEAD@{3}: clone: from file:///path/to/repo
Run Code Online (Sandbox Code Playgroud) 我正在尝试在两个分支之间实现简单的结账操作.代码执行没有错误.
git_libgit2_init();
git_object *treeish = NULL;
git_checkout_options opts;
opts.checkout_strategy = GIT_CHECKOUT_SAFE;
/* branchName in this case is "master" */
handleError(git_revparse_single(&treeish, repo, branchName));
handleError(git_checkout_tree(repo, treeish, &opts));
git_object_free(treeish);
git_libgit2_shutdown();
Run Code Online (Sandbox Code Playgroud)
但是,当我使用它检查它时,分支不会改变git status.我检查了libgit2的101个例子,它说:
git_checkout_options实际上并不是非常可选的.在少数情况下,默认值不会有用.最好的例子是checkout_strategy; 默认值对工作树不执行任何操作.因此,如果您希望结帐检出文件,请选择适当的策略.
NONE相当于干运行; 没有文件将被签出.
SAFE类似于git checkout; 未修改的文件已更新,修改后的文件将保持不变.如果旧HEAD中存在文件但缺少该文件,则认为该文件已删除,并且不会创建.
RECREATE_MISSING与git checkout-index克隆相似,或者在克隆之后会发生什么.更新未修改的文件,并创建丢失的文件,但保留修改的文件.
FORCE类似于git checkout --force; 将覆盖所有修改,并创建所有丢失的文件.
在我的情况下,我正在使用一个非常小的回购测试它,没有未经修改的更改,并且这两个分支之间没有任何冲突.
我究竟做错了什么?我希望这段代码可以做类似的事情git checkout master
libgit2 ×10
git ×8
c ×3
git-checkout ×3
pygit2 ×2
git-branch ×1
libgit2sharp ×1
python ×1
repository ×1
rugged ×1