我有另一个libgit2问题,非常感谢你的帮助。
我正在尝试检索文件历史记录,即更改此文件的提交列表。而且它似乎非常传统......据我所见,它没有任何功能。
我能想到的唯一方法是使用版本控制API迭代修订,检查附加到提交的树对象并在那里搜索给定文件,如果找到,则将提交添加到我的列表中,否则继续下一次提交
但对我来说它看起来并不理想......
可能有其他任何方法,例如,直接查看 .git 文件夹并在那里获取所需信息吗?
非常感谢提前!
答案 0 :(得分:15)
但对我来说它看起来并不理想......
你的方法是正确的。请注意,你必须要反对:
可能有其他方法,例如,直接查看.git文件夹并获取所需信息吗?
即使理解.git文件夹布局总是花费很多时间,但我担心这对于解决此特定文件历史记录问题无法帮助您。
注意:此问题与此libgit2sharp问题非常接近:How to get the last commit that affected a given file?
拉取请求 #963 添加了此功能。
自LibGit2Sharp.0.22.0-pre20150415174523
预发布NuGet包以来可用。
答案 1 :(得分:2)
这主要是在libgit2的issues/495中 即使它是implemented in libgit2sharp(PR 963,对于milestone 22),它仍然可以在libgit2本身“抢夺”。
问题记录在issues/3041: Provide log functionality wrapping the revwalk
中
问题中提到的方法在this libgit2sharp example中使用,可以使用libgit2适应C语言。在3041的决议之前,它仍然是当前的解决方法。
答案 2 :(得分:0)
如果使用C#,此功能已添加到LibGit2Sharp
0.22.0 NuGet Package(Pull Request 963)。您可以执行以下操作:
var fileHistory = repository.Commits.QueryBy(filePathRelativeToRepository);
foreach (var version in fileHistory)
{
// Get further details by inspecting version.Commit
}
在我的Diff All Files VS Extension(这是开源以便您可以查看代码)中,我需要获取文件的先前提交,以便我可以看到在给定提交中对文件进行了哪些更改。这是我检索文件的先前提交的方式:
/// <summary>
/// Gets the previous commit of the file.
/// </summary>
/// <param name="repository">The repository.</param>
/// <param name="filePathRelativeToRepository">The file path relative to repository.</param>
/// <param name="commitSha">The commit sha to start the search for the previous version from. If null, the latest commit of the file will be returned.</param>
/// <returns></returns>
private static Commit GetPreviousCommitOfFile(Repository repository, string filePathRelativeToRepository, string commitSha = null)
{
bool versionMatchesGivenVersion = false;
var fileHistory = repository.Commits.QueryBy(filePathRelativeToRepository);
foreach (var version in fileHistory)
{
// If they want the latest commit or we have found the "previous" commit that they were after, return it.
if (string.IsNullOrWhiteSpace(commitSha) || versionMatchesGivenVersion)
return version.Commit;
// If this commit version matches the version specified, we want to return the next commit in the list, as it will be the previous commit.
if (version.Commit.Sha.Equals(commitSha))
versionMatchesGivenVersion = true;
}
return null;
}