2017-08-04 12 views
0

ファイルの名前を変更すると、ファイルの追加/チェックアウト/リバート/名前変更後の状態を視覚的に更新するGetStatus()メソッドが実行されます/等。以前にチェックアウトしたファイルの名前を変更すると、RenamedInIndexまたはRenamedInWorkingDirステータスではなく、NewInIndexが返されます。ここでlibgit2sharp: "RenameInIndex"がリネームされたときに "NewInIndex"を返すステータス(パス)

は私の方法である:

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()を実行し、返された状態の結果から関心のあるパスを調べるのが最適です。