【问题标题】:Searching for a file in a Git branch在 Git 分支中搜索文件
【发布时间】:2015-02-02 14:06:53
【问题描述】:

我正在尝试获得在所有分支中搜索文件的功能。例如,我有 10 个分支,我需要获取该文件的所有不同版本(查看、比较或更多,例如,我可以为客户提供许多个性化文档、.css 文件、带有硬编码的源文件 - 这是不重要——我只需要访问所有这些)。 libgit2sharp 库可以吗?还是其他 libgit2 实现?

我知道这个

public BranchCollection Branches{
    get { return branches; }
}

还有这条路线

string pathToRepo = "directory//folders//.git";
using (var repo = new Repository(pathToRepo))
{
    foreach (var branch in repo.Branches)
    {
        var file = branch.SEARCH_FOR_FILE(string fileName); //I need something like this   
        Console.WriteLine("File found in" + branch.Name + "yours stuff: " + file.ToString()/something other);
    }
}

我找到了提供在日志中搜索指定提交、添加/移动/删除分支的代码和示例,但是......没有关于搜索文件的内容。有人可以帮助我吗?在合理的时间内有可能吗?如果我使用 Git,我可以尝试在文件系统中搜索所有分支文件夹中的文件(但我猜这是个坏主意),如果我想实现数据库后端怎么办?

如果我是对的,在 Git 中实现了类似的东西,使用命令:

git log --all --pretty=format: | sort -u | grep MyAwesomeFile.extension

【问题讨论】:

  • 要获取有关文件的所有提交,您应该使用git log --follow filename,如果您只需要哈希,可以选择在文件名前添加--pretty=format:"%h"。那就是如果你坚持原生 git...

标签: git libgit2 libgit2sharp


【解决方案1】:

在 Git 中,每个提交都包含源代码的完整快照。此外,每个提交都包含一个指向其父提交(即先前版本的快照)的指针。这种子父关系允许一个人沿着链走并比较不同的版本,以检测沿着这个提交链的变化。

一个分支只指向一个提交(即“最新”版本)。

因此,相同的文件(例如:/path/to/my/file.css)可能以不同的形状存在于分支(最新提交)或其祖先的尖端。

根据您的问题,我了解到您愿意从所有分支的尖端提取相同的文件,以便将它们相互比较。

这可以通过 LibGit2Sharp 轻松完成。 Commit 公开了一个接受路径的索引器。这将返回一个TreeEntryTarget 属性指向 GitObject(在这种情况下为 Blob,因为您要的是文件而不是目录)。

下面的代码将枚举所有分支并转储每个名为/path/to/my/file.css 的文件的内容。警告,下面的代码假定该文件确实存在于您的所有分支中,您可能需要稍微调整一下,不是这样的。

foreach (var branch in repo.Branches)
{
    var treeEntry = branch.Tip["/path./to/my/file.css"];

    if (treeEntry == null)
    {
         // The file doesn't exist in this commit
         continue;
    }

    var blob = (Blob)treeEntry.Target;
    Console.WriteLine(blob.GetContentAsText());
}

【讨论】:

  • 如果这不能完全回答你的问题,请完善它,我会相应地更新我的答案。
  • 是的,这个解决方案应该非常适合我的任务!反正我的答案很少! 1) 路径Tip["/path./to/my/file.css"] 始终是我们正在搜索的分支主文件夹的相对路径?并且使用指针,库不必做诸如昂贵的切换分支之类的事情,对吧?
  • 2) 如果我在 80-90% 的分支中有文件“example.css”时使用类似的解决方案,这是不可能的,是吗?我无法捕捉到 NullReference 的异常,忽略该分支并继续(除了名为 goto :P 的魔法咒语)。我必须在 10-20% 的文件中有空的“example.css”文件吗? 3)它不是直接相关的,但我根本不明白 - 使用 blob 和树 - 他们也在使用 Git 存储库,但以其他方式?它是映射文件-> BLOB、路径和依赖项、指针-> 树?这种方法为我提供了拥有数据库后端的实用程序?
  • @Izzy 1a) 路径相对于提交的根目录。 1b) 不需要分支切换 2) 我更新了代码以显示如何避免 NullPointerException 3) 这看起来像是一个不同的主题。也许很适合另一个 StackOverflow 问题;)
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 2015-10-25
  • 1970-01-01
  • 2018-03-23
  • 2019-08-16
  • 2014-05-31
  • 2011-09-08
  • 2011-11-01
相关资源
最近更新 更多