在 Git 分支中搜索文件

Searching for a file in a Git branch

我正在尝试获得在所有分支中搜索文件的功能。例如,我有 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);
    }
}

我找到了提供在日志、adding/moving/deleting 分支中搜索指定提交的代码和示例,但是...与搜索文件无关。有人可以帮助我吗?在合理的时间内有可能吗?如果我正在使用 Git,我可以尝试搜索,例如在文件系统中对所有分支文件夹中的文件进行强力搜索(但我猜这是个坏主意),如果我想实现数据库后端怎么办?

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

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

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

一个分支只指向一个提交(即 "latest" 版本)。

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

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

这可以通过 LibGit2Sharp 轻松完成。 Commit 公开了一个接受路径的索引器。这将 return 一个 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());
}