libgit2sharp:状态(路径)在预期 "RenameInIndex" 时重命名时返回 "NewInIndex"

libgit2sharp: Status(path) returning "NewInIndex" on rename when "RenameInIndex" expected

当我重命名一个文件时,我 运行 一个 GetStatus() 方法可以在文件 added/checked 输出/ reverted/renamed/etc 之后直观地更新我的文件的状态。当我重命名以前检出的文件时,它 returns NewInIndex 而不是 RenamedInIndex 或 RenamedInWorkingDir 状态。

这是我的方法:

public Tuple<SourceControlStatus, LockStatus> Status(string path)
        {
            try
            {
                var existingPath = path;
                //finds an existing path so we can still get the status of deleted files (repo.Discover will fail if the path does not exist)
                while (!File.Exists(path) && !Directory.Exists(path))
                {
                    existingPath = Path.GetDirectoryName(existingPath);
                }

                var repoPath = Repository.Discover(path);
                using (var repo = new Repository(repoPath))
                {
                   var status = repo.RetrieveStatus(path);
                   return new Tuple<SourceControlStatus, LockStatus>(GetStatus(status), LockStatus.None);
                }
            }
            catch (Exception ex)
            {
            }

            return new Tuple<SourceControlStatus, LockStatus>(SourceControlStatus.Checkin, LockStatus.None);
        }

任何人都可以帮助我了解我需要做什么才能使其准确 return 正确的状态吗?或者是简单的修复,如果项目 returns "NewInIndex",检查整个 repo 的状态,然后检查重命名文件列表,看看是否有匹配的问题。

当您检查单个路径的状态时,没有重命名检测。

由于重命名是通过将 HEAD 与索引进行比较(以确定在索引中重命名的内容)以及通过将索引与工作目录进行比较(以确定在工作目录中重命名的内容)来计算的,重命名的文件没有明确的更改类型。此外,状态信息不会被缓存,每次调用都会重新计算。

最后,为了提高效率,当您请求单个路径的状态时, 检查存储库的其余部分。 (否则,重复的 GetStatus(string path) 操作将变成二次操作。)这意味着无法扫描可能作为该重命名操作的 "other half" 候选的其他文件。

如果您想要重命名信息,这里最好的做法是 GetStatus() 整个存储库,然后从该状态的返回结果中检查您感兴趣的路径。