Можете ли вы получить TFS без необходимости в рабочем пространстве? - PullRequest
8 голосов
/ 17 января 2011

Я пытаюсь изменить наши сценарии сборки с использования SourceSafe на TFS без использования MsBuild (пока).

Одна ошибка - каталог рабочей области переименовывается и архивируется сценариями, что заставляет TFS думать об этомне нужно получать какие-либо файлы.Даже с флагом / force он просто получает каталоги, не получая исходные файлы.

В настоящее время я использую

TF.exe get "Product/Main/Project1"  /force /recursive /noprompt

Чтобы сохранить управление рабочими пространствами в сценарияхили используя промежуточные каталоги, кто-нибудь знает команду, которая может получить каталоги и код, не требуя рабочего пространства?

Ответы [ 6 ]

14 голосов
/ 17 января 2011

Невозможно запустить tf get без рабочей области. Причина в том, что серверу необходимо знать соответствие между путями сервера и локальными путями.

Если вы работаете с большим количеством файлов, не рекомендуется:

  1. Создание и удаление нового рабочего пространства каждый раз
  2. Или, создайте новое рабочее пространство (и никогда не удаляйте его)

Причина этого в том, что каждый раз, когда вы делаете Get, сервер отслеживает, какие файлы, в каких версиях были загружены в какое рабочее пространство. Если вы никогда не очищаете эти рабочие пространства, то таблица, в которой хранится эта информация, со временем будет расти.

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

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

Хотя это не решает вашу проблему, можно перечислять файлы и загружать файлы без рабочего пространства.

Для просмотра файлов:

tf dir $/Product/Main/Project1 /R

Для загрузки файла:

tf view $/Product/Main/Project1/file.cs

Используя творческий пакетный файл, вы можете связать эти два вместе командой FOR. Однако я бы порекомендовал сначала попытаться решить проблему с рабочим пространством, поскольку именно так TFS предназначался для использования.

3 голосов
/ 02 июня 2013

Neno Loje создал небольшую утилиту, которая делает именно то, что вам нужно .Для загрузки он также может удалить любые привязки управления исходным кодом из файла решения и проекта, если вам это нужно.

3 голосов
/ 17 января 2011

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

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

<Target Name="GetDatabaseSources">
    <!-- clean out the folder before doing the fresh get of the database sources -->
    <Folder.CleanFolder Path="$(DatabaseBuildBaseLocation)" Force="true"/>

    <!-- create a workspace for the database source of the product -->
    <CallTarget Targets="CreateDatabaseSourceWorkspace" />
    <!-- get the database sources for the product -->
    <Get TeamFoundationServerUrl="$(TeamFoundationServerUrl)" Workspace="$(DatabaseSourceWorkspaceName)" Recursive="true" Version="$(DatabaseSourceVersion)" Force="true" />
    <!-- delete the workspace -->
    <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" />
</Target>

<!-- creates and maps a temporary workspace for the database source of the product -->
<Target Name="CreateDatabaseSourceWorkspace">
    <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" />
    <Exec Command="$(Tf) workspace /new $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt" />
    <Exec Command="$(Tf) workfold /unmap /workspace:$(DatabaseSourceWorkspaceName) $/" />
    <Exec Command="$(Tf) workfold /map /workspace:$(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) $(DatabaseSourceLocation) &quot;$(DatabaseBuildBaseLocation)&quot;"  />
</Target>

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

1 голос
/ 28 февраля 2014

C # имеет библиотеку VersionControlServer, и вы можете использовать VersionControlServer.GetItems вызов для получения TFS Item . Если ItemType является File, то вызовите DownloadFile , чтобы получить файл.

0 голосов
/ 18 января 2013

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

0 голосов
/ 17 января 2011

Я не знаю, почему ваши сценарии сборки каждый раз удаляют каталоги рабочей области.Но, отвечая на ваш вопрос, я не думаю, что вы можете получить исходный код из TFS без рабочей области.Может быть, вы можете попробовать создать Worspace каждый раз, прежде чем получить.Команда

tf.exe workspace /new
...