在分支中搜索文件

时间:2015-02-02 14:06:53

标签: git libgit2 libgit2sharp

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

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

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

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

如果您可以回答我的任何问题 - 请尝试 - 我正在寻找任何建议和路线尝试;)

1 个答案:

答案 0 :(得分:1)

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

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

这样的文件(例如:/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());
}