【问题标题】:How to find the branch a git commit is on? (Using libgit2sharp)如何找到 git commit 所在的分支? (使用 libgit2sharp)
【发布时间】:2018-04-26 21:11:27
【问题描述】:

对于一个研究项目,我一直在尝试复制 SourceTree 或 TortoiseGit 等版本控制软件中的图形视图。

我正在尝试实现的图表视图

我遇到的最大问题是找到提交所属的分支。如果我有这个,我可以为提交点分配一个列和一个颜色。这很困难,因为在后台,Git 不会存储提交最初所在的分支。

查看 StackOverflow 上的其他解决方案,我发现可以获得包含提交的分支列表,但我需要一种隔离单个分支的方法以显示在我的图表中。以同样的方式 SourceTree 或 TortoiseGit 设法做到了。

我的问题也和这个一样,Find out the branch a commit belongs to in LibGit2Sharp?

看起来他们在私人讨论室中发现了真正的解决方案。但是,我没有评论和询问他们发现了什么的声誉。

有人对我如何做到这一点有任何想法吗?

或者,@nulltoken,如果你偶然看到这个并记得,你知道你们在那个讨论室发现了什么吗?

【问题讨论】:

  • 聊天中的讨论不是私密的:chat.stackoverflow.com/rooms/8237/…
  • 解决这个问题的正常方法是通过附加到提交的 git 注释记录信息。如果您使用的是 gerrit,它会自动为您执行此操作,否则您需要编写一个钩子。
  • @EdwardThomson 哦..这看起来像是我的一个错误假设..哎呀!你能偶然看到聊天的内容吗?我收到“找不到页面”错误...

标签: git libgit2sharp


【解决方案1】:

不确定这个答案对您有多大帮助。对“git branch --contains $SHA1”的 LibGit2Sharp 等效调用是 GitHub 上请求的功能,an open one

很久以前,我使用了 query over all refs like this,但对于您的用例,它可能会非常慢。

我试图寻找可能的方法来缓解这个问题,但找不到任何指路明灯。 :( 然后我发现 this comment 断言您需要遍历 DAG 并验证具有提交的实际分支。这一切都暗示您需要采用慢速遍历所有引用的方法。

【讨论】:

  • 我认为 OP 并没有要求遍历或模仿 branch --contains。 OP 正在询问如何找出所有 refs 的当前提示来装饰它们。
  • (但我重读了几遍,说实话,我真的说不出来。)
  • @edward-thomson,没错! :) 在你的[如此高声誉的人]评论之后,我读了大约 8 次这个问题,但我也无法理解你是如何得出这个结论的,或者我是如何得出我的结论的!只有这让我怀疑:The biggest problem ...I need a method of isolating...
  • 我想澄清一下,我已经成功复制了git branch --contains。问题是多个分支可以包含相同的提交。这使得很难在我的图表中选择一个显示为“拥有该提交”(例如,它是否属于 NewBranch2 或 master)。例如如果我从“master”创建分支“A”,在“A”上做了一些工作,然后将“A”合并到 master,git branch --contains $(any sha from A) 将返回 A, master
  • 感谢@jade-white 的澄清。您可以通过reflog 评估作为提交的exact 所有者的分支。我并没有太多使用这个功能,在快速搜索中我偶然发现了这个可以帮助你的线程:stackoverflow.com/a/18505238/3991696。请注意,您可以使用reflog 搜索有限的历史记录。希望对您有所帮助。
【解决方案2】:

事实证明,生成图,SourceTree 不需要知道提交在哪个分支上。

图表中的第一个提交总是有一列 0。此外,可以获得给定提交的父提交列表。通过从第一次提交开始并向后迭代,他们可以仅使用此信息生成漂亮的图表。

【讨论】:

    【解决方案3】:

    当您希望显示的不仅仅是 HEAD 的历史(通过枚举 repository.Commits 来实现)时,这对于如何执行此操作可能很有价值:

    repository.Commits
        .QueryBy(new CommitFilter 
        {
            IncludeReachableFrom = repository.Refs.ToList(), // or adjust to your needs
            SortBy = CommitSortStrategies.Time
        })
        .Distinct<Commit>(EqualityComparer<GitObject>.Default)
        .ToList();
    

    复制自/灵感来自: https://stackoverflow.com/a/68564141/2240196

    在迭代提交时,您检查哪些 refs(包括分支)指向它们以在图中显示 ref 名称。
    我建议将 refs 存储在 Lookup 中以查找指向每个提交的引用:

    ILookup<GitObject, string> refsByCommit = repo.Refs.ToLookup(@ref => @ref.ResolveToDirectReference().Target, @ref => @ref.CanonicalName);
    // ( ... )
    foreach (var commit in commits)
    {
        // ( ... )
        var refNames = refsByCommit[commit];
        // ( ... )
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 2021-08-18
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2019-08-10
      • 2014-02-10
      相关资源
      最近更新 更多