Using git commands in a TeamCity Build Step

One of my TeamCity v7.0 build projects relies on using a diff between the current development branch and the master branch to determine what needs to be run. I've written a small script that uses something like:

git diff origin/master..origin/QA --name-only --diff-filter=AM | DoSomethingWithThoseFiles

Unfortunately, the build log indicates that git diff is not working. When I go into the buildAgent/work directory for this project, I see that there is no .git folder, so it cannot perform the git operations required.

I've put teamcity.git.use.local.mirrors=true in the buildAgent.properties file as mentioned at TW-15873, but that does not seem to help in any way.

Is there anything I can do to get the list of files changed between two branches in a script for my build step?


Solution 1:

Try changing the VCS checkout mode to "Always checkout files on agent" as documented here. That should give the build script access to the .git folder.

Solution 2:

@Mike Two's answer is correct, one needs to configure the VCS root to use Checkout mode Automatically on Agent -not- on the server. The TC docs do not mention that this required setting is hidden by default as 'advanced'. So here is a picture of what to look for.

Advanced Settings

FYI, My specific VS2013 Solution step error was from MSBuild, as below. I am using the latest TeamCity Enterprise 9.0 EAP (build 31963). [PreBuildEvent] Exec [14:21:55][Exec] git rev-parse --short=9 HEAD > "C:\TeamCity\buildAgent\work\e5e910561e800525\MYPROJECT\bin\Debug\version.txt" [14:21:55][Exec] fatal: Not a git repository (or any of the parent directories): .git [14:21:55][Exec] C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1131, 5): error MSB3073: The command "git rev-parse --short=9 HEAD > "C:\TeamCity\buildAgent\work\e5e910561e800525\Higgens\bin\Debug\version.txt"" exited with code 128. [14:21:55]

//edit; I didn't know how to add this to a comment.

Solution 3:

Setting teamcity.git.use.shallow.clone=false and teamcity.git.fetchAllHeads=true may be what's missing, at least on the latest version of TC.