在Azure DevOps中,是否有一个指向文件原始内容的链接?

38

在GitHub上,可以生成指向文件原始内容的链接,那么在VSTS/DevOps中是否也能够实现呢?


1
请查看如何从VSO存储库获取文件链接,我相信这正是解决您的问题的方法。 - Zlatko Michailov - MSFT
9个回答

47
即使阅读了现有的答案,我仍然对此有些困惑,所以我想留下更详细的回答。
正如其他人所说,模式是(为了便于阅读,将查询拆分成单独的行):
https://dev.azure.com/{{organization}}/{{project}}/_apis/sourceProviders/{{providerName}}/filecontents
  ?repository={{repository}}
  &path={{path}}
  &commitOrBranch={{commitOrBranch}}
  &api-version=7.0

但是你如何找到这些变量的值呢?如果你进入Azure DevOps,选择左侧导航中的“Repos”>“Files”,然后选择特定的文件,你当前的URL应该类似于这样:
https://dev.azure.com/{{organization}}/{{project}}/_git/{{repository}}?path=%2Fpackage.json

你应该使用这些值来组织、项目和仓库。对于路径,你会看到一个HTTP编码的Unix文件路径版本。`%2F`是`/`的HTTP编码,所以该路径实际上只是`/package.json`(像Postman这样的工具会为你进行编码)。
提交或分支相当明显;你要么知道你想要的值,要么应该使用`master`。我在上面的URL中“硬编码”了API版本,因为文档当前指向的就是那个版本。

对于最后一个变量,你需要使用providerName。简而言之,你应该使用TfsGit。我从源提供程序列表中找到了这个值,并查找了一个具有supportedCapabilities.queryFileContentstrue的提供程序。

然而,如果你只是请求这个URL,你会收到一个"203非权威信息"的响应,因为你仍然需要进行身份验证。再次参考同样的文档,它表示要使用基本身份验证,用户名可以是任意值,密码则使用个人访问令牌。你可以在https://dev.azure.com/{{organization}}/_usersSettings/tokens创建一个个人访问令牌;确保它具有构建:读取权限。

如果你对这种事情不熟悉,Postman是非常有帮助的,在你开始写代码之前可以用它来确保这些请求能够正常工作。

所以,如果您的存储库在根目录下有一个名为src的目录,并且您想要获取src/package.json文件的内容,您的URL应该类似于:

https://dev.azure.com/{{organization}}/{{project}}/_apis/sourceProviders/TfsGit/filecontents?repository={{repository}}&commitOrBranch=master&api-version={{api-version}}&path=src%2Fpackage.json

别忘了基本身份验证!


4
非常好的回答,有一个小补充。我生成了一个个人访问令牌,但是除非我启用“令牌管理-读取和管理”权限,否则它将无法工作。我本来期望正确的特权是“代码-读取”,但似乎没有任何效果。 - mtlynch
1
@mtlynch 这个评论刚刚救了我自己 :) - Kisaragi
1
你有什么想法可以将响应的MIME类型从text/plain更改为text/html吗? - jan-seins
1
目前您需要设置“Build: Read”令牌范围来完成此操作。不再需要使用“Token Administration”。如果您愿意,还可以使用现代的 api-version=7.0。URL的其余部分保持不变。 - Anton Rusak

8

1
我该如何进行身份验证? - Gregory Suvalian
许多在线文章:https://blog.devmatter.com/calling-vsts-apis-with-powershell/ - 4c74356b41
能否在URL本身中指定认证?我看到所有文章都需要将其作为HTTP标头的一部分。 我需要这个URL成为ARM模板的一部分,它不允许除URL字符串外的任何操作 - Gregory Suvalian
据我所知没有,但我一直在使用这个。最坏的情况下,您可以编写一个代理 Azure 函数。 - 4c74356b41
和静态的?比如可以在维基标记文件中使用? - grmbl
我从未有过这方面的需求,所以不能百分之百确定,但我认为您无法在Azure DevOps中使用URL身份验证,因此答案可能是否定的。 - 4c74356b41

5
你可以使用chrome获取原始URL。
打开开发者工具并查看网络选项卡。
在DevOps门户网站上导航至所需文件(内容面板)。一旦内容视图可见,请再次检查网络选项卡,并找到以“Items?Path”开头的URL,这是包含所需“url:”元素的JSON响应。

不同意,几篇帖子上面提到获取所需参数,但是根据这篇帖子,这些参数可以很容易地从Chrome中获取。 - Ron
我的错误。最近通过了我的第一组代码审核,我相信这是我审查的第一份“答案”之一。要么是我看错了问题,要么是我看错了答案,因为没问题,很好。对此感到抱歉,并感谢您指出我的错误 :) - Michael Hoobler

3

1
你好。请查看帮助中心以了解如何正确回答问题。https://stackoverflow.com/help/how-to-answer - DjSh
我不确定为什么这被认为是不恰当的,因为它提供了直接的答案和答案的来源。我曾经有同样的问题,这很容易就是更好的答案。 - Alex White
可以通过提及需要获取个人访问令牌以在授权标头中使用(以及如何获取该令牌)来改进它。 - Alex White
嗨@AlexWhite,我试图在readme文件中添加一个部署按钮,指向ARM模板(json文件),以此来实现这个目标。我发现了另一个API,可以让我获取原始内容,但是我得知我的仓库必须是公共的而不是私有的才能使用该API。如果你感兴趣的话,这是另一个API。 - Judy Ann Dixon

2
大多数答案都解决了这个问题,但是在具有匿名访问权限的公共存储库上下文中,API 是不同的。以下是适用于此类情况的 API:

https://dev.azure.com/{{organization_name}}/{{project_name}}/_apis/git/repositories/{{repo_name_encoded}}/items?scopePath={{path_to_your_file}}&api-version=6.0

这是 Github 提供的“原始” URL 的确切等效。


感谢你的编辑。只是为了澄清一下:我是自雇人士,并在我的名字下经营公司,而“organization_name”这里真的是我个人的名字。因此对于某些人来说可能不太明显。如果一个人是在一个组织内工作,那么确实应该使用组织的名称。 - Joerg Krause

1
从附件窗口拖动文件名并将其放入任何其他 MS 应用程序中,以获取原始 URL 或链接的文件名。

你能举个例子说明你所指的 MS 应用程序是哪一个吗? - Gregory Suvalian
Outlook新邮件。运行得很好。 - zumalifeguard

0

如果您想快速获取正在浏览的特定文件的原始URL,还有另外一种方法可能会有所帮助:

  • 安装名为“Undisposition”的浏览器扩展程序
  • 从点菜单(右上角)中选择“下载”:该文件将在新的浏览器选项卡中打开,您可以从中复制URL

(编辑:不幸的是,这仅适用于浏览器知道如何打开的文件类型,否则它仍将提供下载...)


0

我在编程方面还是个新手,最近在Azure DevOps Repo中访问原始文件时遇到了问题。在Github上很简单。

我想使用Curl在CMD和BASH中下载一个文件。 首先,我在浏览器中浏览文件内容,并记下粗体部分: https://dev.azure.com/**myOrg**/_git/**myProjectName**?path=%2F**MyFileName.ps1**

然后,我构建了与@Zach上面发布的类似的URL。

https://dev.azure.com/**myOrg**/**myProjectName**/_apis/sourceProviders/TfsGit/filecontents?repository=**myProjectName**&commitOrBranch=**master**&api-version=5.0-preview.1&path=%2F**MyFileName.ps1**

现在当我将上述URL粘贴到浏览器中时,它以原始形式显示内容,类似于GitHub。 不同之处在于,我必须在我的Azure DevOps帐户中设置PAT(个人访问令牌),然后在DOS/BASH示例中验证URL:

curl -u "<username>:<password>" "https://dev.azure.com/myOrg/myProjectName/_apis/sourceProviders/TfsGit/filecontents?repository=myProjectName&commitOrBranch=master&api-version=5.0-preview.1&path=%2FMyFileName.ps1" -# -L -o MyFileName.ps1

0

所以这个想法不是克隆整个仓库,而是从仓库中选择一个特定的文件,以下是如何操作的示例。

让我们假设这是您的 Azure DevOps 仓库,可以从浏览器访问。

https://dev.azure.com/<Org>/<Project>/_git/<Repo>?path=<Path>

要在终端访问或获取文件,请使用此统一资源标识符(URI)。

https://dev.azure.com/<Org>/<Project>/_apis/sourceProviders/TfsGit/filecontents?repository=<Repo>&commitOrBranch=master&api-version=6.0&path=<Path> 

Windows

Invoke-WebRequest https://dev.azure.com/<Org>/<Project>/_apis/sourceProviders/TfsGit/filecontents?repository=<Repo>&commitOrBranch=master&api-version=6.0&path=<Path> -Credential <PSCredential>

或者

$pair = "<username>:<password>"
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
$basicAuthValue = "Basic $encodedCreds"
$Headers = @{
   Authorization = $basicAuthValue
}
$repo = https://dev.azure.com/<Org>/<Project>/_apis/sourceProviders/TfsGit/filecontents?repository=<Repo>&commitOrBranch=master&api-version=6.0&path=<Path>
$downloadPath = "C:\Temp\$fileName"
Invoke-WebRequest -Uri $uri -Headers $Headers 

Linux

curl -u "<username:password>" https://dev.azure.com/<Org>/<Project>/_apis/sourceProviders/TfsGit/filecontents?repository=<Repo>&commitOrBranch=master&api-version=6.0&path=<Path>

请注意:
您的用户名将是您在Azure DevOps中的用户名,而密码将是您的PAT(个人访问令牌)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接