在脚本中运行 Git 命令

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

对于某些工作流,你需要自己的生成管道运行 Git 命令。 例如,在完成基于功能分支的 CI 生成后,团队可能希望将该分支合并到主体中。

Microsoft 托管代理本地代理上均可使用 Git。

启用脚本以运行 Git 命令

注意

在开始之前,请确保帐户的默认标识是使用以下代码设置的。 这必须作为签出代码后的第一步来完成。

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

向生成服务授予版本控制权限

  1. 通过“组织设置”>“常规”>“项目”转到组织的项目设置页面。

    选择组织设置。

  2. 选择要编辑的项目。

    选择项目。

  3. 在“项目设置”中,选择“存储库”。 选择要在其上运行 Git 命令的存储库。

  4. 选择“安全性”以编辑存储库安全性。

    选择“安全性”以编辑存储库安全性。

  5. 搜索“项目集合生成服务”。 选择标识 {{your project name}} Build Service ({your organization})(而非组 Project Collection Build Service Accounts ({your organization}))。 默认情况下,此标识可以从存储库中读取数据,但不能将任何更改推送回存储库。 授予要运行的 Git 命令所需的权限。 通常情况下,需要授予以下权限:

    • 创建分支:允许
    • 参与:允许
    • 读取:允许
    • 创建标记:允许

转到“版本控制”控制面板选项卡

  • Azure Repos:https://dev.azure.com/{your-organization}/{your-project}/_admin/_versioncontrol

  • 本地:https://{your-server}:8080/tfs/DefaultCollection/{your-project}/_admin/_versioncontrol

管理项目

如果看到此页面,请选择存储库,然后选择链接:

控制面板顶部到项目

控制面板项目版本控制选项卡

在“版本控制”选项卡上,选择要在其中运行 Git 命令的存储库,然后选择“项目集合生成服务”。 默认情况下,此标识可以从存储库中读取数据,但不能将任何更改推送回存储库。

权限

授予要运行的 Git 命令所需的权限。 通常情况下,需要授予以下权限:

  • 创建分支:允许
  • 参与:允许
  • 读取:允许
  • 创建标记:允许

授予权限后,请确保选择“保存更改”。

允许脚本访问系统令牌

添加一个 checkout 部分,并将 persistCredentials 设置为 true

steps:
- checkout: self
  persistCredentials: true

详细了解 checkout

“选项”选项卡上,选择“允许脚本访问 OAuth 令牌”。

确保清理本地存储库

生成管道不会自动清理对本地存储库的某些类型的更改。 因此,请确保:

  • 删除创建的本地分支。
  • 撤消 git 配置更改。

如果在使用本地代理时遇到问题,请确保存储库干净:

确保 checkout 已将 clean 设置为 true

steps:
- checkout: self
  clean: true

示例

列出存储库中的文件

在“生成”选项卡上添加以下任务:

任务 参数

实用工具:命令行
列出 Git 存储库中的文件。
工具:git

参数ls-files

将功能分支合并到主分支

你希望通过一个 CI 生成合并到主分支(如果生成成功)。

“触发器”选项卡上,选择“持续集成(CI)”并包括要生成的分支。

在存储库的根目录中创建 merge.bat

@echo off
ECHO SOURCE BRANCH IS %BUILD_SOURCEBRANCH%
IF %BUILD_SOURCEBRANCH% == refs/heads/main (
   ECHO Building main branch so no merge is needed.
   EXIT
)
SET sourceBranch=origin/%BUILD_SOURCEBRANCH:refs/heads/=%
ECHO GIT CHECKOUT MAIN
git checkout main
ECHO GIT STATUS
git status
ECHO GIT MERGE
git merge %sourceBranch% -m "Merge to main"
ECHO GIT STATUS
git status
ECHO GIT PUSH
git push origin
ECHO GIT STATUS
git status

“生成”选项卡上,将此项添加为最后一个任务:

任务 参数

实用工具:批处理脚本
运行 merge.bat。
路径:merge.bat

FAQ

如果我的远程存储库位于 GitHub 或其他 Git 服务(如 Bitbucket 云)中,是否可以运行 Git 命令?

可以使用哪些任务来运行 Git 命令?

批处理脚本

命令行

PowerShell

Shell 脚本

如何避免在脚本进行推送时触发 CI 生成?

***NO_CI*** 添加到提交消息。 示例如下:

  • git commit -m "This is a commit message ***NO_CI***"
  • git merge origin/features/hello-world -m "Merge to main ***NO_CI***"

[skip ci] 添加到提交消息或说明。 示例如下:

  • git commit -m "This is a commit message [skip ci]"
  • git merge origin/features/hello-world -m "Merge to main [skip ci]"

还可以使用这些变体中的任何一种提交到 Azure Repos Git、Bitbucket Cloud、GitHub 和 GitHub Enterprise Server。

  • [skip ci][ci skip]
  • skip-checks: trueskip-checks:true
  • [skip azurepipelines][azurepipelines skip]
  • [skip azpipelines][azpipelines skip]
  • [skip azp][azp skip]
  • ***NO_CI***

需要使用代理吗?

至少需要一个代理才能运行生成或发布。

我遇到了问题。 如何对其进行故障排除?

请查看排查生成和发布问题

我无法选择默认代理池,无法将生成或发布排队。 如何修复此问题?

请查看代理池

我的 NuGet 推送任务失败,出现“错误: 无法获取本地颁发者证书”错误。 如何解决此问题?

可通过添加受信任的根证书来解决此问题。 可将环境变量 NODE_EXTRA_CA_CERTS=file 添加到生成代理,也可在管道中添加任务变量 NODE.EXTRA.CA.CERTS=file。 有关此变量的更多详细信息,请参阅 Node.js 文档。 有关在管道中设置变量的说明,请参阅在管道中设置变量

我在本地使用 TFS,但没有看到其中某些功能。 为什么看不到?

其中某些功能仅在 Azure Pipelines 上可用,在本地尚不可用。 如果你已升级到最新版本的 TFS,则可在本地使用这些功能。