title | ms.custom | description | ms.topic | ms.technology | ms.assetid | ms.date | monikerRange |
---|---|---|---|---|---|---|---|
Run Git commands in a script |
seodec18 |
Learn how you can run a Git command in a build script for your workflow by using Azure Pipelines or Team Foundation Server (TFS) |
conceptual |
devops-cicd |
B5481254-F39C-4F1C-BE98-44DC0A95F2AD |
03/22/2019 |
>= tfs-2015 |
[!INCLUDE temp]
::: moniker range="<= tfs-2018" [!INCLUDE temp] ::: moniker-end
For some workflows you need your build pipeline to run Git commands. For example, after a CI build on a feature branch is done, the team might want to merge the branch to master.
Git is available on Microsoft-hosted agents and on on-premises agents.
Note
Before you begin, be sure your account's default identity is set with:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
Go to the Version Control control panel tab ▼
- Azure Repos:
https://dev.azure.com/{your-organization}/{your-project}/_admin/_versioncontrol
- On-premises:
https://{your-server}:8080/tfs/DefaultCollection/{your-project}/_admin/_versioncontrol
If you see this page, select the repo, and then click the link:
On the Version Control tab, select the repository in which you want to run Git commands, and then select Project Collection Build Service. By default, this identity can read from the repo but cannot push any changes back to it.
Grant permissions needed for the Git commands you want to run. Typically you'll want to grant:
- Create branch: Allow
- Contribute: Allow
- Read: Allow
- Create tag: Allow
When you're done granting the permissions, make sure to click Save changes.
::: moniker range="< tfs-2018"
On the variables tab set this variable:
Name | Value |
---|---|
system.prefergit |
true |
::: moniker-end
::: moniker range=">= tfs-2018"
::: moniker-end
::: moniker range="azure-devops"
Add a checkout
section with persistCredentials
set to true
.
steps:
- checkout: self
persistCredentials: true
Learn more about checkout
.
On the options tab select Allow scripts to access OAuth token.
::: moniker-end
::: moniker range="< azure-devops"
On the options tab select Allow scripts to access OAuth token.
::: moniker-end
Certain kinds of changes to the local repository are not automatically cleaned up by the build pipeline. So make sure to:
- Delete local branches you create.
- Undo git config changes.
If you run into problems using an on-premises agent, make sure the repo is clean:
::: moniker range="azure-devops"
Make sure checkout
has clean
set to true
.
steps:
- checkout: self
clean: true
- On the repository tab set Clean to true.
::: moniker-end
::: moniker range="< azure-devops"
-
On the repository tab set Clean to true.
-
On the variables tab create or modify the
Build.Clean
variable and set it tosource
::: moniker-end
::: moniker range="< tfs-2018" Make sure to follow the above steps to enable Git. ::: moniker-end
On the build tab add this task:
Task | Arguments |
---|---|
![]() Utility: Command Line List the files in the Git repo. |
Tool: git Arguments: ls-files |
You want a CI build to merge to master if the build succeeds.
::: moniker range="< tfs-2018" Make sure to follow the above steps to enable Git. ::: moniker-end
On the Triggers tab select Continuous integration (CI) and include the branches you want to build.
Create merge.bat
at the root of your repo:
@echo off
ECHO SOURCE BRANCH IS %BUILD_SOURCEBRANCH%
IF %BUILD_SOURCEBRANCH% == refs/heads/master (
ECHO Building master branch so no merge is needed.
EXIT
)
SET sourceBranch=origin/%BUILD_SOURCEBRANCH:refs/heads/=%
ECHO GIT CHECKOUT MASTER
git checkout master
ECHO GIT STATUS
git status
ECHO GIT MERGE
git merge %sourceBranch% -m "Merge to master"
ECHO GIT STATUS
git status
ECHO GIT PUSH
git push origin
ECHO GIT STATUS
git status
On the build tab add this as the last task:
Task | Arguments |
---|---|
![]() Utility: Batch Script Run merge.bat. |
Path: merge.bat |
Can I run Git commands if my remote repo is in GitHub or another Git service such as Bitbucket Cloud?
Yes
::: moniker range="<= azure-devops-2019"
Add ***NO_CI***
to your commit message. Here are examples:
git commit -m "This is a commit message ***NO_CI***"
git merge origin/features/hello-world -m "Merge to master ***NO_CI***"
::: moniker-end
::: moniker range="> azure-devops-2019"
Add [skip ci]
to your commit message or description. Here are examples:
git commit -m "This is a commit message [skip ci]"
git merge origin/features/hello-world -m "Merge to master [skip ci]"
You can also use any of the variations below. This is supported for commits to Azure Repos Git, Bitbucket Cloud, GitHub, and GitHub Enterprise Server.
[skip ci]
or[ci skip]
skip-checks: true
orskip-checks:true
[skip azurepipelines]
or[azurepipelines skip]
[skip azpipelines]
or[azpipelines skip]
[skip azp]
or[azp skip]
***NO_CI***
::: moniker-end
::: moniker range="< tfs-2018"
When you set system.prefergit
to true
, the build pipeline uses command-line Git instead of LibGit2Sharp to clone or fetch the source files.
::: moniker-end
[!INCLUDE temp]
::: moniker range="< azure-devops" [!INCLUDE temp] ::: moniker-end