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()
整个存储库,然后从该状态的返回结果中检查您感兴趣的路径。
当我重命名一个文件时,我 运行 一个 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()
整个存储库,然后从该状态的返回结果中检查您感兴趣的路径。