2017-08-04 58 views
0

当我重命名文件时,我运行GetStatus()方法,在添加/检出/恢复/重命名后,可以更新文件的状态/等等。当我重命名以前检出的文件时,它将返回NewInIndex而不是RenamedInIndex或RenamedInWorkingDir状态。libgit2sharp:在重命名时返回“NewInIndex”的状态(当重命名为“RenameInIndex”时)

这里是我的方法:

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); 
     } 

谁能帮助我明白我需要做的就是它准确地返回正确的状态?或者只是修复,如果该项目返回“NewInIndex”,检查整个回购的状态,然后检查重命名文件的列表,并查看是否有任何匹配的问题。

回答

1

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

由于通过将HEAD区分为索引(以确定索引中重命名的内容)并通过将索引区分到工作目录(以确定工作目录中重命名的内容)来计算重命名,所以不存在显式更改键入重命名的文件。此外,状态信息不被缓存,每次调用都会重新计算。

最后,为了提高效率,当您请求单个路径的状态时,其余存储库是而不是已检查。 (否则,重复的GetStatus(string path)操作将变为二次)。这意味着没有能力扫描其他可能是候选文件的文件作为该重命名操作的“另一半”。

如果要重命名信息,最好在此处对GetStatus()整个存储库进行检查,然后从返回的状态结果中检查您感兴趣的路径。