Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Command line "get latest" from TFS without mapping workspaces and such

Tags:

automation

tfs

I assume that this:

tf.exe get $/project /recursive

...needs this weird workspace mapping, known TFS server and such.

Is there any way I could do this simplest thing: go connect to this TFS server using this set of credentials, get latest source code for this project and put it here? All from the command line.

like image 751
Anton Gogolev Avatar asked Aug 01 '12 13:08

Anton Gogolev


People also ask

What is the command line statement to edit workspace settings in TFS?

To make the current directory a working folder for an existing workspace on your computer, type tf workspace workspacename, where workspacename is the name of the existing workspace. The Edit Workspace dialog box appears.


6 Answers

Firstly, are you wanting a copy of the controlled files that are no longer under source-control (such as a SVN export) or are you still hoping to work with the files and TFS?

Option 1: No Binding at all

If you simply want a copy of the latest files and no 'binding' to TFS, you're going to have to do a little work yourself. Leaving aside credentials ([/login:username,[password]] parameter to many command line methods).

  1. Use the TF command to get a list of the files: tf dir "$/YourSolution" /Recursive > files.txt
  2. Process files.txt with some clever batch file (or use a scripting language):
  3. Read lines starting with $/ and this is the directory, create the directory in your destination (remove first three characters and the last character, a colon).
  4. Read the next lines (until blank or end of file), each of these represents a file in the directory discovered in step 3. Assuming you have the file in a variable %file% and directory %dir%, then issue the following command (for each file in that directory):

tf view "$/%DIR%/%FILE%" "/output:Your-Target-Path/%DIR%/%FILE%"

or if you're happy with the current directory as the target:

tf view "$/%DIR%/%FILE%" "/output:%DIR%/%FILE%"

Note, you need the %DIR%/%FILE% in the output part or all files will be dumped in to the same directory.

NOTE: this is likely to a be VERY high bandwidth and slow operation!

Option 2: Temporary Mapping

  1. Create a temporary workspace: tf workspace /new /collection:<URL_TO_SERVER> /permission:Private (note, this will prompt, there is a no-prompt option but determining a name for the workspace is left as an exercise)
  2. Make a directory for files, e.g. LOCALDIR
  3. Create a mapping for your folders: tf workfold /map "$/SERVER_DIR" "LOCALDIR"
  4. Go into LOCALDIR
  5. Get the files tf get . /Recursive

At this point you should now have all of the files and if you wanted you also have a binding with TFS so you could commit changes. Alternatively, you can now copy the content elsewhere and break the mapping/workspace. Using the correct command line variants of tf workfold /unmap and tf workspace /delete will unmap your workfolder and delete the workspace.

like image 141
Ray Hayes Avatar answered Oct 30 '22 01:10

Ray Hayes


Export any folder cleanly from TFS? Finally found a brilliant solution I think.

I am not going to completely research this for you now, but intend to replace my incredibly messy build server workspace synch script with this later, when I get the time.

Solution:

Use Microsoft's Git-TF to get the source to disk without having to set up a workspace or anything. I tried the command, and it worked wonderfully. Think it will work for TFS 2010 and 2012. From what I can understand, there will be no bindings or workspaces or anything left behind that will cause problems later. I think all you need to install is GIT and GIT-TF.

http://www.microsoft.com/en-us/download/details.aspx?id=30474

You will actually get the files into a GIT repository, which is not a problem at all. You will get a (hidden?) folder named .git inside the folder you exported, and I guess you can simply delete it to get rid of any trace of GIT.

If someone implements this, which should be easy, please confirm it works as expected.

like image 25
Bent Tranberg Avatar answered Oct 30 '22 01:10

Bent Tranberg


Quick solution
Building on Ray Hayes option 2 answer, I put together an actual script that should be straight forward to use for those who just want the quick and dirty solution. You should read his aswer for more info.

To use it:

  • Set the four variables to your working environment
  • remember that your tf.exe might not be located in the same directory that I have it in, especially if you are reading this from the future :)

.

SET COLLECTION_URL="http://localhost:8080/tfs/<collection>"
SET SERVER_DIR="$/<REMOTE_SOLUTION_DIR>"
SET LOCAL_DIR="X:\<YourLocalDir>"
SET TF_DIR="C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE"

%TF_DIR%\tf workspace /new /collection:%COLLECTION_URL% /permission:Private /noprompt tmp_batchws
%TF_DIR%\tf workfold /map %SERVER_DIR% %LOCAL_DIR%
cd /d %LOCAL_DIR%
%TF_DIR%\tf get . /Recursive
%TF_DIR%\tf workspace /delete tmp_batchws /noprompt
like image 44
Silas Hansen Avatar answered Oct 30 '22 01:10

Silas Hansen


i wrote the powershell for the leading answer

$base = "f:\whereyouwantthefilestogo\"
foreach($l in get-content D:\outputfromTFdir.txt)
{
    if($l -match '^\$.*\:$')
    {
        $repopath = $l.trim(':')
        write-host 'base path'
        $basepath = "$base$($l.Substring(2,$l.Length -3) -replace '/','\')"
        if((Test-Path $basepath) -eq $false)
        {
            write-host 'making directory'
            New-Item -ItemType directory -Path $basepath
        }
        continue;
    }
    elseif($l -match '^\$')
    {
        write-host 'sub folder'
        $subfolderpath = "$basepath\$($l.trim('$'))"
        if((Test-Path $subfolderpath) -eq $false)
        {
            write-host 'making directory'
            New-Item -ItemType directory -Path $subfolderpath
        }
        continue;
    }
    elseif($l -match '.*\..*')
    {
        write-host 'get file'
        $filename = "$basepath\$l"
        write-host $filename
        $repofile = "$repopath/$l"
        tf view "$repofile" "/output:$filename" /collection:http://tfsserver
    }
    else{write-host 'blank line'}
}
like image 23
Don Fouts Avatar answered Oct 30 '22 01:10

Don Fouts


There is no "easy" option when it comes to TFS command lines - they almost always involve an awful lot of typing (such as not being able to simply have a default set up so you don't have to specify a collection URL on every command)

The usual way to make TFS command lines "simple" is to write batch files to hide away all the details that have to be specified every time (server URLs and recurse flags etc)

TF.exe does allow you to do almost anything, though, so it is a pretty straight-forward sequence of tf calls to create a temporary mapping, do a Get and and delete the mapping again.

like image 36
Jason Williams Avatar answered Oct 30 '22 03:10

Jason Williams


http://johannblais.blogspot.com/2014/07/tfs-equivalent-of-svn-export.html

http://tfs-server:port/tfs/Collection/TeamProject/Team/_api/_versioncontrol/itemContentZipped?repositoryId=&path=url-encoded-source-control-path

  • tfs-server is the TFS server hostname
  • port is the TFS port (usually 8080)
  • Collection is the name of your team project collection
  • TeamProject is the name of your team project
  • Team is the name of the team
  • url-encoded-source-control-path is the URL encoded source control path (for example, $/Project1/Main/Sources/Folder/SubFolder becomes %24%2FProject1%2FMain%2FSources%2FFolder%2FSubFolder
like image 25
JJS Avatar answered Oct 30 '22 01:10

JJS