我试图获得在所有分支中搜索文件的功能。例如,我有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
如果您可以回答我的任何问题 - 请尝试 - 我正在寻找任何建议和路线尝试;)
答案 0 :(得分:1)
在git中,每个提交都包含源代码的完整快照。此外,每次提交都包含一个指向其父(s)提交的指针(即快照的先前版本)。这个子到父关系允许一个人沿着链走,并比较不同的版本,以便检测这个提交链的变化。
分支仅指向一个提交(即“最新”版本)。
这样的文件(例如:/path/to/my/file.css
)可能在分支的尖端(最新提交)或其祖先中以不同的形式存在。
根据您的问题,我了解您愿意从所有分支机构的提示中提取相同的文件,以便将它们相互比较。
这可以通过LibGit2Sharp轻松完成。 Commit
公开了一个接受路径的索引器。这将返回TreeEntry
。 Target
属性指向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());
}