如何通过Azure DevOps Python API检查文件是否已有关联提交或拉取请求(PR)
如何通过Azure DevOps Python API检查文件是否已有关联提交或拉取请求(PR)
这个报错我之前碰到过好多次,本质就是同一文件在同一个提交或PR流程里被重复操作了,提前做个检查就能完美避开。下面分两步给你说怎么用Azure DevOps的Python API实现预检查:
一、检查文件是否有关联提交
你可以通过Git客户端获取指定文件的提交记录,重点关注最近的提交是否属于未处理的状态(比如还没合并到主分支的提交)。
首先得确保你装了依赖包:
pip install azure-devops
然后是具体的代码实现:
from azure.devops.connection import Connection from msrest.authentication import BasicAuthentication import os # 配置你的Azure DevOps信息,建议用环境变量存PAT避免硬编码 personal_access_token = os.getenv("AZURE_DEVOPS_PAT") organization_url = "https://dev.azure.com/你的组织名" project_name = "你的项目名" repo_name = "你的仓库名" target_file = "src/xyz.yml" # 要检查的文件路径 # 建立和ADO的连接 creds = BasicAuthentication("", personal_access_token) connection = Connection(base_url=organization_url, creds=creds) # 获取Git操作客户端 git_client = connection.clients.get_git_client() # 搜索指定文件的最近提交 latest_commits = git_client.get_commits( project=project_name, repository_id=repo_name, search_criteria={ "item_path": target_file, "top": 1 # 只获取最近1条提交记录 } ) # 判断并输出结果 if latest_commits: commit = latest_commits[0] print(f"⚠️ 文件 {target_file} 存在最近提交:") print(f"提交ID: {commit.commit_id[:7]}") # 显示短ID更简洁 print(f"提交作者: {commit.author.name}") print(f"提交时间: {commit.author.date.strftime('%Y-%m-%d %H:%M:%S')}") # 这里可以根据你的自动化逻辑加判断,比如如果提交不是当前自动化脚本创建的,就阻止后续PR操作 else: print(f"✅ 文件 {target_file} 暂无关联提交")
二、检查文件是否有活跃的关联PR
除了提交,还要检查有没有处于「打开」状态的PR在处理这个文件,避免重复发起PR。
接着上面的连接代码,继续写PR检查的逻辑:
# 获取Pull Request操作客户端 pr_client = connection.clients.get_pull_request_client() # 搜索目标仓库的活跃PR(状态为Open) active_prs = pr_client.get_pull_requests( repository_id=repo_name, project=project_name, search_criteria={ "status": "active", # 只筛选未关闭的PR "target_ref_name": "refs/heads/main" # 替换成你的目标分支 } ) # 遍历PR,检查是否包含目标文件 file_has_active_pr = False for pr in active_prs: # 获取当前PR的所有文件变更 pr_changes = pr_client.get_pull_request_changes( project=project_name, repository_id=repo_name, pull_request_id=pr.pull_request_id ) # 逐个检查变更文件 for change in pr_changes.changes: if change.item.path == target_file: file_has_active_pr = True print(f"⚠️ 文件 {target_file} 存在关联活跃PR:#{pr.pull_request_id} - {pr.title}") break if file_has_active_pr: break if not file_has_active_pr: print(f"✅ 文件 {target_file} 暂无关联活跃PR")
实际使用建议
把这两个检查逻辑放到你「创建PR」按钮的前置步骤里:
- 先检查文件的最近提交,如果存在非自动化创建的提交,提示用户确认
- 再检查是否有活跃PR处理该文件,如果有,直接阻止PR创建操作
这样就能从根源上避免你遇到的Multiple operations were attempted on file错误了。
备注:内容来源于stack exchange,提问作者anjalib
相关产品推荐
相关产品推荐

