public IRevisionVersion GetRevisionOfItem(IRevisionVersion maxRevisionVersion, string path)
    {
      var relativePath = path.Substring(m_fileSystemPath.Length);

      Commit maxCommit = maxRevisionVersion.GetCommit();
      var fileInGit = maxCommit[relativePath];
      if (fileInGit == null)
      {
        return new GitRevisionVersion(m_branch.Commits.Last()); // BegginingOfTime;
      }

      Commit foundCommit = null;
      {
        foreach (var commit in m_repository.Commits)
        {
          if (commit.Parents.Count() == 1)
          {
            TreeChanges changes = m_repository.Diff.Compare<TreeChanges>(commit.Tree, commit.Parents.Single().Tree);
            if (HasAnyChanged(changes.Added, relativePath) || 
                HasAnyChanged(changes.Modified, relativePath))
            {
              foundCommit = commit;
              break;
            }
          }
        }
      }

      if (foundCommit == null)
      {
        // This is a bug change every thing
        return new GitRevisionVersion(m_branch.Commits.Last()); // BegginingOfTime;
      }
      else
      {
        return new GitRevisionVersion(foundCommit);
      }
    }
        public IEnumerable<IRevision> GetRevisions(IRevisionVersion sourceRevision, IRevisionVersion targetRevision)
        {
            System.Collections.IEnumerable changesets = m_versionControlServer.QueryHistory(
            m_sourceControlRootPath,
            targetRevision.GetSpec(),
            0, 
            RecursionType.Full, 
            null,
            sourceRevision.GetSpec(),
            targetRevision.GetSpec(),
            int.MaxValue,
            true, 
            false);

            int? sourceChangeSetId = null;
            if (sourceRevision.GetSpec() is ChangesetVersionSpec)
            {
                sourceChangeSetId = (sourceRevision.GetSpec() as ChangesetVersionSpec).ChangesetId;
            }

            HashSet<string> items = new HashSet<string>();
            foreach (var changeset in changesets.OfType<Changeset>())
            {
                if (!sourceChangeSetId.HasValue || sourceChangeSetId.Value != changeset.ChangesetId)
                {
                    foreach (Change change in changeset.Changes)
                    {
                        if (change.Item.ServerItem.StartsWith(m_sourceControlRootPath,
                            StringComparison.OrdinalIgnoreCase))
                        {
                            var item = change.Item.ServerItem.Substring(m_sourceControlRootPath.Length);
                            items.Add(item);
                        }
                    }
                }
            }
            return items.Select(p=> new TfsRevision(MakeFileSystemType(p))).ToList();
        }
        public IRevisionVersion GetRevisionOfItem(IRevisionVersion maxRevisionVersion, string path)
        {
            try
            {
                if (!m_workspace.IsValueCreated)
                {
                    var invoker = m_workspace.Value;
                }

                var item = m_versionControlServer.GetItem(
                    System.IO.Path.Combine(m_sourceControlRootPath, path),
                    maxRevisionVersion.GetSpec(),
                    DeletedState.NonDeleted, GetItemsOptions.None);

                return new TFSRevisionVersion(new ChangesetVersionSpec(item.ChangesetId));
            }
            catch (Exception e)
            {
                return new TFSRevisionVersion(new DateVersionSpec(new DateTime(1973, 1, 1))); ; // The begining of time;
            }
        }
    public IEnumerable<IRevision> GetRevisions(IRevisionVersion sourceRevision, IRevisionVersion targetRevision)
    {
      HashSet<string> paths = new HashSet<string>(new StringIgnoreCaseEqualityComarer());

      Commit minCommit = sourceRevision.GetCommit();
      var maxCommit  = targetRevision.GetCommit();

      if (maxCommit.Equals(minCommit))
      {
        // Nothing Happend
        return Enumerable.Empty<IRevision>();
      }
      IEnumerable<Commit> allCommits = FindAllCommits(maxCommit, minCommit);

      List<Commit> affectedCommits = new List<Commit>();
      foreach (var currentCommit in allCommits)
      {
        int count = currentCommit.Parents.Count();
        // We Ignore all merges
        if (count == 1)
        {
          affectedCommits.Add(currentCommit);
          foreach (var parent in currentCommit.Parents)
          {
            TreeChanges changes = m_repository.Diff.Compare<TreeChanges>(currentCommit.Tree, parent.Tree);
            AddChanges(paths, changes.Added);
            AddChanges(paths, changes.Deleted);
            AddChanges(paths, changes.Modified);
            AddChanges(paths, changes.Renamed);
            AddChanges(paths, changes.TypeChanged);
          }
        }
      }

      return paths.Select(p => new GitRevision(p)).ToList();
    }