получить набор файлов, которые были изменены после определенной даты - PullRequest
2 голосов
/ 07 октября 2009

Есть ли у кого-нибудь удобный скрипт PowerShell, который получает набор файлов из TFS на основе даты модификации ? Я хотел бы сказать «дайте мне все файлы в этой папке (или подпапке), которые были изменены после X / Y / ZZZZ», и выведите эти файлы в папку, отличную от папки, в которую они обычно переходят. Я знаю достаточно PowerShell, чтобы взломать и сделать это, в конце концов, но я надеюсь избежать этого.

Ответы [ 2 ]

5 голосов
/ 07 октября 2009

Убедитесь, что у вас установлена ​​ Team Foundation 2015 Power Tools . Он поставляется с оснасткой PowerShell. Вы можете запустить файл консоли PowerShell прямо из его группы запуска или выполнить Add-PSSnapin Microsoft.TeamFoundation.PowerShell Затем перейдите в рабочее пространство и выполните:

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    Format-Table CheckinDate,TargetServerItem -auto

CheckinDate           TargetServerItem 
-----------           ----------------
9/14/2009 1:29:23 PM  $/Foo/Trunk/Bar.sln                            
9/29/2009 5:08:26 PM  $/Foo/Trunk/Baz.sln       

Чтобы вывести эту информацию в каталог:

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    Select TargetServerItem > c:\recentlyChangedFiles.txt

Чтобы скопировать эти файлы в другой каталог (предполагается, что они локально перенесены в рабочую папку):

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    CopyItem -Path $_.LocalItem -Destination C:\SomeDir -Whatif

Обратите внимание, что при этом файлы копируются в плоскую структуру папок. Если вы хотите сохранить структуру dir, она немного сложнее.

4 голосов
/ 09 октября 2009

Использование Get-TfsItemProperty, такого как Keith, не требует только рабочего пространства для копий файлов. Это оболочка для GetExtendedItems (), серверный запрос локальной информации, наиболее часто встречающийся в Source Control Explorer. Полагаясь на информацию о версии, которую он сообщает, вы предполагаете, что сами файлы были загружены (в более общем случае: синхронизировано , в случае переименования и удаления) за последние 30 дней. Если рабочее пространство не обновлено, вы пропустите некоторые файлы / дадите им устаревшие имена / и т. Д. Это также довольно дорого, так как информационные команды идут.

Некоторые альтернативные примеры:

# 1
Get-TfsChildItem $/FilesYouWant -R | 
    ? { $_.CheckinDate -gt (Get-Date).AddDays(-30) } | 
    % { $_.DownloadFile(join-path C:\SomeDir (split-path $_.ServerItem -leaf)) }

# 2
Get-TfsItemHistory $/FilesYouWant -R -All -Version "D$((Get-Date).AddDays(-30).ToString('d'))~" |
    Select-TfsItem |
    Select -Unique -Expand Path |
    Sort |
    Out-File c:\RecentlyChanged.txt

Первый - это простая адаптация кода Кейта, использование более дешевого запроса и устранение зависимости от рабочей области. Это лучший вариант, если вы знаете, что% товаров из этого каталога были недавно изменены.

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

[Да, я знаю, что наличие -Version требует строки, не очень в духе Powershell; моя вина. Вы могли бы создать DateVersionSpec с new-object и вызвать его ToString (), но это еще больше работы.]

Я не показывал каждую комбинацию вызова API + желаемую задачу. Само собой разумеется, что вы можете использовать # 1 для генерации списка файлов и # 2 для (повторной) загрузки путем изменения второй половины конвейера. Вы даже можете комбинировать эту технику копирования с эффективностью Get-TfsItemHistory:

# 2b, with local-to-local copying
Get-TfsItemHistory $/FilesYouWant -R -All -Version "D$((Get-Date).AddDays(-30).ToString('d'))~" | 
    Select-TfsItem |
    Select -Unique -Expand Path |
    Get-TfsItemProperty | 
    Copy $_.LocalItem -Dest C:\SomeDir

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

Могу я просто сказать, что для этого нужно использовать PowerShell, что кажется абсурдом.

FWIW, я был связан с TFS изнутри и снаружи MS в течение 4,5 лет и никогда не видел эту функцию запрошенной. Если бы вы могли рассказать о том, какую цель вы на самом деле пытаетесь достичь, я думаю, мы могли бы предложить лучший способ. Не поймите меня неправильно, я написал расширения Powershell именно для таких странных сценариев, как этот. Но часто это работа для другого инструмента целиком, например: Annotate, MSBuild, сравнение схем БД ...

...