TFS: как отменить извлечение неизмененных файлов в пакетном файле

172

Мы используем пакетный файл для генерации кода, и он автоматически проверяет сгенерированные файлы с Team Foundation Server (TFS), чтобы он мог восстановить их. Большинство этих файлов не изменены, но генератор не знает об этом заранее.

Команда "tfs undo" отменяет извлечение, но выдает запрос, если некоторые из них были изменены (что мы не хотим делать). Мы также не хотим сразу проверять сгенерированные файлы.

Есть ли команда (или серия команд) для отмены извлечения всех неизмененных файлов без запроса пользователя?

Роберт Вагнер
источник
Обратите внимание, что отмена всех изменений вручную с ожиданием выбора «Нет всем» при запросе об измененных файлах не будет работать корректно, так как отменит ADDизменения без запроса (см . Ответ Рэя ).
Эласканатор

Ответы:

202

Ознакомьтесь с командой «Отменить без изменений» в Team Foundation Server Power Tools Август 2011 г.

c:\myProject> tfpt uu . /noget /recursive

Спасибо Мэтту Флоренсу за обновление ссылки.

Спасибо Рэй Вега за актуальный синтаксис .

Майк Чалий
источник
1
Это должно быть отредактировано / объединено, чтобы содержать информацию об использовании как часть содержания ответа.
McW
4
Вы действительно хотите прочитать этот пост: aaubry.net/undo-checkout-on-unchanged-files-tfs.html
Байрон Уитлок
17
хм, кое-что, что почти каждый делает несколько раз в день: «Давайте поместим его в отдельный инсталлятор под названием Power Tools» ...
sigh
1
@ Майк Чалий, ты бы мог подумать. Я сейчас пробую TFS, искал, как это сделать, и оказался здесь.
виджет
3
Это не работает, если ваши изменения слияния. Кажется, что tfpt uu всегда рассматривает слияние как реальное изменение, даже если нет изменений файла, и нет возможности изменить это поведение. Это нормально, как поведение по умолчанию, но иногда это не то, что вы хотите.
user1164178
124

Установите Team Foundation Server Power Tools и запустите следующее из командной строки, используя tfpt.exe в корне каталога рабочей области вашего проекта:

c:\myProject> tfpt uu . /noget /recursive

Включение /nogetнастоятельно рекомендуется, поскольку оно предотвращает принудительное получение последних версий всех файлов вашего проекта, что в зависимости от общего количества может занять очень много времени.

луч
источник
12
Это должен быть принятый ответ, в нем есть все соответствующие детали (что подтверждается более высоким баллом).
rikoe
7
Прохладно. Кроме того, почему бы не добавить это как постоянный «Внешний инструмент» в Visual Studio. Возьмем для примера: blog.kurtschindler.net/post/… Команда: [ каталог вашей установки] \ TFPT.EXE Аргументы: uu. / noget / recursive Начальный каталог: $ (SolutionDir)
rohancragg
12
Вопрос указывает на выполнение этой операции без приглашения , но ни один из ответов, похоже, не решает эту проблему. Если вам это нужно, то дополнительный / noprompt - это опция, которую вы ищете. В документации PowerTools этого нет! В нем перечислены эта опция для нескольких команд, но не для этой (UU). Осторожно!
Джонни Кауфман
1
@ user20358 либо cdтуда, где находится каталог вашего рабочего пространства (например, мой c:\myProject), либо явным образом включите его после uu(заменив период .на него)
Рэй
Имеет ли это переключатель силы, например / Y или / force? Меня всегда спрашивают, действительно ли вы хотите отменить это, и я бы хотел, чтобы это было автоматизировано. Поместите / Y там, но он говорит мне, что для параметра Y требуется значение.
Белка
118

Спасибо, @mike & @ray,

Я хочу сделать это проще.

В VS в меню «Сервис» нажмите «Внешние инструменты».

Внешние инструменты

Нажмите Добавить.

Введите название.

Команда: tfpt.exe

Аргументы: уу. / noget / recursive

Начальный каталог: [вы можете выбрать из кнопки со стрелкой].

Отменить без изменений в решении

Отменить без изменений в проекте

Две новые команды добавлены в меню Инструменты.

Используйте их при необходимости.

Наслаждаться,

Офир

Офир
источник
3
Очень круто. Вы можете пойти еще дальше и добавить ярлык. Обратите внимание, как далеко вниз добавлена ​​ваша команда (например, она может быть четвертой). Затем выберите Инструменты -> Параметры -> Среда -> Клавиатура ->, введите текстовое поле «Показать команды, содержащее» «Tools.External» и назначьте ярлык. Например, я выбрал Tools.ExternalCommand4, так как моя недавно добавленная команда отмены была четвертой. Затем я назначил сочетания клавиш Ctrl + Alt + U, Ctrl + Alt + U
Mario
1
Можем ли мы иметь обновленную версию этого? Если найден tf.exe, но что такое команда uu? это говорит мне Нераспознанная команда: uu. Спасибо за помощь
Шей
1
@Shay: работает на VS2015 с последними установленными электроинструментами TFS.
Игорь Малин
27
  1. Щелкните правой кнопкой мыши по вашему проекту
  2. Выберите отменить оформление заказа, затем просто нажмите "ОК" или еще какое-либо подтверждение ...
  3. Затем, при отмене извлечения, для каждого файла, имеющего РЕАЛЬНЫЕ изменения в нем, появится запрос на подтверждение извлечения для этого файла ... просто нажмите «Нет всем»

Visual Studio будет знать, есть ли у извлеченного файла изменения или их нет.

ВНИМАНИЕ: Этот метод также удаляет новые файлы, то есть файлы, которые еще не зарегистрированы в TFS. Если вы хотите сохранить эти файлы, просто исключите их из набора файлов, которые вы «отменяете».

Рэй Лионфанг
источник
14
Be aware that this method also removes added files that are not yet checked in from TFS.... да, это довольно немедленный дисквалификатор.
shortstuffsushi
1
Это работает для слияния моих необоснованных веток. Спасибо. Обычно в этом случае VS отмечает все файлы в решении как измененные.
KoViMa
2
это ад, когда Nuget делает заказ для 10000 файлов, которые не требуется обновлять.
Евгений Наида
13

Обновлен этот вопрос с ответом при работе только с TFS2017 и VS2017 / VS2019 .

Для TFS 2017 не существует мощных инструментов, и старые не могут хорошо работать вместе с ним, но, очевидно, большая часть функциональности перенесена в сам VS2017 или плагины (см. Ниже).

Visual Studio 2017/2019 Расширение

Некоторые действия, такие как отмена неизмененных файлов, перемещены в

расширение для VS2017

расширение для VS2019

Расположение кнопки «Отменить без изменений»:

отменить неизменное расположение кнопки

Известная ошибка

Вы должны открыть «Source Control Explorer» (и оставить его открытым), чтобы «Undo Unchanged» отображался в меню «Action» в представлении «Pending Changes». сообщили здесь .

Расширение интеграции оболочки Windows

Кроме того, вы по-прежнему можете настроить интеграцию оболочки Windows с помощью отдельного установщика, который больше не связан с TFS Power Tools.

Интеграция с оболочкой Windows не работает точно так же, как раньше с powertools, но самые важные действия сработали для меня.

Schwarzie2478
источник
Я заметил в вопросе, что они хотят написать это, потому что у меня нет решения, я боюсь
Schwarzie2478
1
Я не могу найти опцию «Отменить без изменений» в VS2017 после установки связанного расширения. Я что-то пропустил ?
Erzékiel
Я не очень этим пользовался. Когда я использовал его, чтобы протестировать его для своего клиента, мне пришлось немного щелкнуть в Team Explorer и убедиться, что изменения были отменены. Возможно, эта опция появляется только в том случае, если у вас есть только ожидающие изменения, поставленные в очередь для коммита. (или только одна ветка меняется) ...
Schwarzie2478
2
@ Erzékiel Опция появляется только тогда, когда Solution Explorer открыт и готов.
MatrixRonny
1
Это расширение работает иногда , и его присутствие будет связано , имеющий TFS Source Control Explorer , открытым и не обозревателе решений (как некоторые ошибочно указывал) - не перепутать два разных окна управления. Тем не мение; когда я говорю иногда, это потому что он приходит и уходит. Прямо сейчас у меня нет этого, я сделал месяц назад. Это немного глючит, и я боюсь, что другие расширения - виновник, такой как Решарпер и тому подобное.
Кристиан
8

Если вы просто вернете все файлы обратно, которые вы извлекли, TFS будет достаточно умен, чтобы выяснить, какие из них изменились, и включить их только в набор изменений, записанный на сервере.

TFS делает это путем сравнения MD5-хэшей содержимого файлов до и после регистрации.

Все это предполагает, что ваш процесс генерации просто обновляет тот же набор файлов, т.е. у вас никогда не будет случая, когда файл, который был создан в предыдущем поколении, не нужен в следующем поколении (то есть вы хотели бы ожидать удаления для этого файла) или что файлы меняют имя.

Если вашему процессу потенциально может потребоваться удаление файлов, лучше всего посмотреть на команду Team Foundation Power Tools ( tfpt ) и использовать онлайн-команду tfpt, которая будет проверять только файлы, которые были изменены, и будет достаточно умной, чтобы Pend удаляет для любых файлов, которые больше не нужны или изменили имя и Pend добавляет.

Удачи,

Мартин.

Мартин Вудворд
источник
6
Спасибо за это, однако мы не хотим проверять измененные файлы в то время. Измененные не следует регистрировать до тех пор, пока функция не будет завершена, но неизмененные следует удалить, чтобы разработчик мог просмотреть изменения.
Роберт Вагнер
@RobertWagner Если у вас закрытая сборка, вы можете отменить (если она не прерывается при одинаковом обнаружении файла), когда вы получите всплывающее предупреждение о том, что изменения должны быть собраны в первую очередь.
Эласканатор
6

Помните, что отмена TFS не вернет значение «Дата изменения» файловой системы. Это очень неприятно, особенно если вы используете такие инструменты, как robocopy, для синхронизации удаленных компьютеров. Даже после отмены извлечения, если вы сохранили файл и обновили значение «Дата изменения», это обновленное значение будет сохраняться даже после отмены извлечения.

evermeire
источник
1
Или используйте robocopy или VCS, использование смеси всегда будет давать несоответствия. Намного лучше было бы заполнить каждую машину непосредственно из VCS.
Ричард
4

Есть пара моментов, касающихся опции uu для tfpt (рекомендуется в большинстве других ответов), которые сначала мне не были понятны. Во-первых, это справка командной строки, доступ к которой можно получить командойtfpt uu /?

Отменяет избыточные ожидающие изменения. Если состояние элемента с ожидающим изменением такое же, как на сервере, то изменение отменяется.

Использование: tfpt uu [/ changeset: changesetnum] [/ recursive] [/ noget] [filespec ...]

  • / changeset Сравнить рабочее пространство с состояниями элементов в версии набора изменений, указанной вместо последней версии.
  • filespec ... Проверять только указанные спецификации файлов на предмет избыточных изменений
  • / recursive Проверить указанные спецификации файлов с полной рекурсией
  • / noget Не запускать get перед проверкой

Параметр / changeset нельзя использовать с файловыми спецификациями или / recursive.

Теперь позвольте мне разбить команду, которая рекомендуется в других ответах.

tfpt uu . /noget /recursive
  • tfpt uu указывает, что мы хотим использовать команду «Отменить без изменений».
  • . указывает (я предполагаю), что текущий рабочий каталог должен использоваться как спецификация файла.
  • /noget гарантирует, что 'get последней версии' не вызывается до удаления неизмененных файлов.
  • /recursiveгарантирует, что будет учитываться не только спецификация файла, но и все рекурсивные дочерние папки и файлы. Кажется, это зависит от спецификаций файлов - если ничего не указано, обрабатывается все рабочее пространство.

Так что здесь есть пара моментов, которые нужно отметить относительно команды сверху ...

  • Это зависит от рабочего каталога.
  • Он не обрабатывает все рабочее пространство.

Я обнаружил, что следующая команда работает лучше всего для меня - она ​​будет обрабатывать все рабочее пространство.

tfpt uu /noget

Обратите внимание, что он все еще зависит от рабочего каталога в том, что tfpt использует его, чтобы определить, какое рабочее пространство должно быть обработано. Но пока вы указываете путь к файлу или папке в рабочей области, вы можете идти.

Скотт Мунро
источник
3

Я вижу подход Рэй ЛайонФанга выше. Не могу комментировать, так как у меня нет представителя. Хотя мне нравится этот подход, так как в Инструменты и т. Д. Не требуется никаких изменений ........

  1. Щелкните правой кнопкой мыши по вашему проекту
  2. выберите отменить оформление заказа, затем просто нажмите "ОК" или еще какое-либо подтверждение ...
  3. затем, при отмене извлечения, для каждого файла, в котором есть РЕАЛЬНЫЕ изменения, появится запрос на подтверждение извлечения для этого файла ... просто нажмите «Нет всем»
  4. Visual Studio будет знать, есть ли у извлеченного файла изменения или их нет. Имейте в виду, что этот метод также удаляет добавленные файлы, которые еще не зарегистрированы из TFS ...

....... есть проблема с этим подходом в том, что при нажатии "No To All" сохраняются несколько файлов, которые не были изменены. Кажется, что-то происходит, как отмена неизмененных файлов до тех пор, пока не попадет первый файл, который действительно был изменен, а затем проигнорирует оставшиеся неизмененные файлы, если это имеет смысл. Я видел этот эффект только время от времени.

Потенциальный обходной путь - следовать вышеуказанному процессу, но вместо нажатия «Нет для всех» нажмите «Нет» для каждого файла. Поскольку это может занять некоторое время в зависимости от количества файлов, с которыми вы работаете, обычно я удерживаю нажатой клавишу «ALT + N», и она просто ускоряет все файлы, удаляя ВСЕ неизмененные файлы.

ясень
источник
пожалуйста, имейте ввиду, что это не может быть подчеркнуто достаточно. Вновь добавленные файлы в проект также удаляются с помощью этого подхода. Это упоминается в нескольких других ответах.
Кристиан
-20

Насколько я понял, в TFS, если вы извлекаете командный проект, весь проект извлекается, и у вас нет контроля над тем, какие файлы отключены. Если вы хотите запретить проверку определенных файлов, вы можете заблокировать их.

На работе мы все ненавидим TFS.

achinda99
источник
1
Мы можем проверить отдельные файлы, и их блокировка не позволит разработчику проверить их.
Роберт Вагнер,
5
Собирался понизить голосование, но «На работе мы все ненавидим TFS». сохранил это.
Джеймс