标签: libgit2

比较 2 次提交

我没有找到任何关于获取两个文件之间差异的文档。我使用下面的代码使用坚固的方式提交文件

@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)

如何在崎岖中看到同一对象的两次提交之间的差异?

git libgit2 rugged

4
推荐指数
1
解决办法
833
查看次数

使用 Pygit2 实现拉取

我正在尝试使用 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)

python libgit2 pygit2

4
推荐指数
1
解决办法
2739
查看次数

未能创建提交:当前提示不是 libgit2 提交期间的第一个父错误

我正在使用 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)

libgit2

4
推荐指数
1
解决办法
2883
查看次数

libgit2:查找两个标签之间的所有提交?

我想知道如何使用 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)

c git libgit2 objective-git

4
推荐指数
1
解决办法
273
查看次数

如何使用libgit2克隆/获取git存储库?

我需要初始化一个git存储库并获取最新版本的分支.在bash中,命令是:

git init
git remote add -t $BRANCH -f origin $REMOTE
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用libgit2以编程方式执行相同操作,但是在查找第二行的等效项时遇到了问题.创建远程的调用是显而易见的,但我没有看到任何将它添加到存储库或处理分支.

用libgit2可以做到这一点吗?如果没有,是否有能够这样做的图书馆?

git libgit2

3
推荐指数
1
解决办法
3438
查看次数

使用libgit2进行git checkout

这个问题是我上一个问题的演变或解决方案:克隆一个git repo(深入)我认为在这种情况下创建一个新问题是最好的事情,但我可能错了.

这个很简单:我将如何git checkout master使用libgit2做一些相同的事情

这似乎是一年前不可能的:https://github.com/libgit2/libgit2/issues/247 据此,至少5个月前克隆是可能的.但我从未见过有关如何操作的任何代码,文档示例.(编辑)我的意思是我没有看到任何关于包含的完整克隆git checkout,也没有关于结帐的任何代码/文档.

c git git-checkout libgit2

3
推荐指数
1
解决办法
2494
查看次数

LibGit2Sharp CheckoutPaths()

我做了一个提交(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)

git repository git-checkout libgit2 libgit2sharp

3
推荐指数
1
解决办法
855
查看次数

"在FETCH_HEAD中无效的描述"在Visual Studio中进行拉/同步

在Visual Studio 2013中从GitHub中提取我的存储库时:

发生错误.详细消息:libgit2引发了一个错误.类别= 20(错误).FETCH_HEAD第2行中的描述无效

从命令行,git pullgit push说一切都是最新的,正常.

以下是生成此错误消息的libgit2源代码:http://cpansearch.perl.org/src/ALEXBIO/Git-Raw-0.27/xs/libgit2/src/fetchhead.c

git libgit2 visual-studio-2013

3
推荐指数
1
解决办法
1359
查看次数

"(无分支)"与"(abc1234分离)"之间的区别

通常当你在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 git-branch pygit2

3
推荐指数
1
解决办法
724
查看次数

使用libgit2的checkout分支

我正在尝试在两个分支之间实现简单的结账操作.代码执行没有错误.

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.我检查了libgit2101个例子,它说:

git_checkout_options实际上并不是非常可选的.在少数情况下,默认值不会有用.最好的例子是checkout_strategy; 默认值对工作树不执行任何操作.因此,如果您希望结帐检出文件,请选择适当的策略.

NONE相当于干运行; 没有文件将被签出.

SAFE类似于git checkout; 未修改的文件已更新,修改后的文件将保持不变.如果旧HEAD中存在文件但缺少该文件,则认为该文件已删除,并且不会创建.

RECREATE_MISSINGgit checkout-index克隆相似,或者在克隆之后会发生什么.更新未修改的文件,并创建丢失的文件,但保留修改的文件.

FORCE类似于git checkout --force; 将覆盖所有修改,并创建所有丢失的文件.

在我的情况下,我正在使用一个非常小的回购测试它,没有未经修改的更改,并且这两个分支之间没有任何冲突.

git log

我究竟做错了什么?我希望这段代码可以做类似的事情git checkout master

c git git-checkout libgit2

3
推荐指数
1
解决办法
886
查看次数