Как отменить контроль другого пользователя в TFS?

Как я сказал в своем предыдущем сообщении, вот некоторый код в C#, который реализует O (1) матричное вращение для любой матрицы размера. Для краткости и удобочитаемости там не проверка ошибок или проверка диапазона. Код:

static void Main (string [] args)
{
  int [,]
    //  create an arbitrary matrix
    m = {{0, 1}, {2, 3}, {4, 5}};

  Matrix
    //  create wrappers for the data
    m1 = new Matrix (m),
    m2 = new Matrix (m),
    m3 = new Matrix (m);

  //  rotate the matricies in various ways - all are O(1)
  m1.RotateClockwise90 ();
  m2.Rotate180 ();
  m3.RotateAnitclockwise90 ();

  //  output the result of transforms
  System.Diagnostics.Trace.WriteLine (m1.ToString ());
  System.Diagnostics.Trace.WriteLine (m2.ToString ());
  System.Diagnostics.Trace.WriteLine (m3.ToString ());
}

class Matrix
{
  enum Rotation
  {
    None,
    Clockwise90,
    Clockwise180,
    Clockwise270
  }

  public Matrix (int [,] matrix)
  {
    m_matrix = matrix;
    m_rotation = Rotation.None;
  }

  //  the transformation routines
  public void RotateClockwise90 ()
  {
    m_rotation = (Rotation) (((int) m_rotation + 1) & 3);
  }

  public void Rotate180 ()
  {
    m_rotation = (Rotation) (((int) m_rotation + 2) & 3);
  }

  public void RotateAnitclockwise90 ()
  {
    m_rotation = (Rotation) (((int) m_rotation + 3) & 3);
  }

  //  accessor property to make class look like a two dimensional array
  public int this [int row, int column]
  {
    get
    {
      int
        value = 0;

      switch (m_rotation)
      {
      case Rotation.None:
        value = m_matrix [row, column];
        break;

      case Rotation.Clockwise90:
        value = m_matrix [m_matrix.GetUpperBound (0) - column, row];
        break;

      case Rotation.Clockwise180:
        value = m_matrix [m_matrix.GetUpperBound (0) - row, m_matrix.GetUpperBound (1) - column];
        break;

      case Rotation.Clockwise270:
        value = m_matrix [column, m_matrix.GetUpperBound (1) - row];
        break;
      }

      return value;
    }

    set
    {
      switch (m_rotation)
      {
      case Rotation.None:
        m_matrix [row, column] = value;
        break;

      case Rotation.Clockwise90:
        m_matrix [m_matrix.GetUpperBound (0) - column, row] = value;
        break;

      case Rotation.Clockwise180:
        m_matrix [m_matrix.GetUpperBound (0) - row, m_matrix.GetUpperBound (1) - column] = value;
        break;

      case Rotation.Clockwise270:
        m_matrix [column, m_matrix.GetUpperBound (1) - row] = value;
        break;
      }
    }
  }

  //  creates a string with the matrix values
  public override string ToString ()
  {
    int
      num_rows = 0,
      num_columns = 0;

    switch (m_rotation)
    {
    case Rotation.None:
    case Rotation.Clockwise180:
      num_rows = m_matrix.GetUpperBound (0);
      num_columns = m_matrix.GetUpperBound (1);
      break;

    case Rotation.Clockwise90:
    case Rotation.Clockwise270:
      num_rows = m_matrix.GetUpperBound (1);
      num_columns = m_matrix.GetUpperBound (0);
      break;
    }

    StringBuilder
      output = new StringBuilder ();

    output.Append ("{");

    for (int row = 0 ; row <= num_rows ; ++row)
    {
      if (row != 0)
      {
        output.Append (", ");
      }

      output.Append ("{");

      for (int column = 0 ; column <= num_columns ; ++column)
      {
        if (column != 0)
        {
          output.Append (", ");
        }

        output.Append (this [row, column].ToString ());
      }

      output.Append ("}");
    }

    output.Append ("}");

    return output.ToString ();
  }

  int [,]
    //  the original matrix
    m_matrix;

  Rotation
    //  the current view of the matrix
    m_rotation;
}

хорошо, я подниму руку, она на самом деле не делает никаких модификаций к исходному массиву при вращении. Но, в системе OO, которая не имеет значения, пока объект похож, он был повернут клиентам класса. В данный момент Матричные ссылки использования класса на данные исходного массива, настолько изменяющиеся любое значение m1, также изменят m2 и m3. Небольшое изменение конструктора, чтобы создать новый массив и скопировать значения в него уладит это.

89
задан brett rogers 1 November 2013 в 18:52
поделиться

2 ответа

Для этого есть как минимум 2 различных способа:

Командная строка

В Team Explorer есть утилита командной строки под названием Tf.exe. Найдите документацию здесь . Доступ к нему можно получить, запустив окно командной строки Visual Studio. Синтаксис команды:

tf undo [/workspace:workspacename[;workspaceowner]] 
[/server:servername] [/recursive] itemspec [/noprompt]

Для одного файла

tf undo /workspace:workspacename;workspaceowner $/projectname/filename.cs

GUI

Второй - через графический интерфейс, но не входит в стандартную комплектацию - вам необходимо установить TFS Power Tools . См. здесь для получения подробной информации о том, как использовать этот метод.

Имейте в виду, что для любого метода вам потребуются соответствующие права. Разрешения называются «Отменить изменения других пользователей» и «Разблокировать изменения других пользователей». Эти разрешения можно просмотреть:

  1. Щелкните правой кнопкой мыши нужный проект, папку, или файл в Source Control Explorer
  2. Выберите «Свойства»
  3. Выберите вкладку «Безопасность»
  4. Выберите соответствующего пользователя или группу в разделе «Пользователи и группы» вверху
  5. Просмотрите «Полномочия для [пользователя / группы]: "раздел внизу

Удаление рабочего пространства

tf workspace /delete WorkspaceName;User
             /server:http://server:8080/tfs/MyTeamCollection 
135
ответ дан 24 November 2019 в 07:14
поделиться

Самый простой способ, который я нашел, - это использовать бесплатное приложение TFS Sidekick . У него есть возможность просмотреть и отменить оформление заказа другим пользователем.

36
ответ дан 24 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: