Microsoft在有关Git的大量文章中提到this博客,其中讨论了一个称为“有限引用”的概念。对于限制每个用户可以看到哪些服务器分支,以在基于非分叉的TFS Git服务器配置中提供更有条理的客户端体验来说,这似乎是一个非常有用的功能。
不幸的是,这篇文章忽略了提及如何使用所述功能,而我在网上找不到的其他信息似乎都没有对此进行记录。我自己做了很多工作,并在TFS SQL DB中发现了prc_UpdateGitLimitedRefCriteria存储过程,该过程将记录添加到表中以将过滤器应用于返回给客户端的ref,但是仅向该表添加信息是不够的。必须有一些我找不到的开/关开关。
有人能启用“受限引用”功能吗?如果可以,您该怎么做?
答案 0 :(得分:1)
因此,在广泛研究数据库之后,我设法找到了一个解决方案。我找不到通过UI进行操作的方法,但是要使其正常工作,必须在数据库中完成两个关键操作。
首先,您需要启用此功能,该功能已在存储库设置中启用。虽然我无法在UI中找到设置,但是如果您从存储库的默认设置中进行了任何调整,则JSON对象将保存到dbo.tbl_PolicyConfigurationRevision表中,该表包含一个将为null的“ optimizedByDefault”元素,请从将null设置为true,现在将在所讨论的仓库中启用该功能。
或者,可以使用here中所述的TFS Rest API的“策略配置”端点来完成此操作。它涉及的更多,并且仍然涉及到JSON的调整,但是它经过正式公开的渠道,而无需直接的DB操作,并且可以正确地对配置更改进行版本控制。
第二,您需要指定“重要”引用是什么。有一个存储的proc和自定义数据类型可以帮助您解决此问题。 dbo.prc_UpdateGitLimitedRefCriteria接受partitionId,dataspaceId,repositoryId和两个精确匹配匹配和namespaceRefs匹配的自定义表数据类型记录。用重要的引用建立表,然后调用存储的proc将它们添加到列表中。
看来,这最终要通过prc_QueryGitRefs存储的过程来过滤ref,因此,如果需要更多有关如何格式化它们的详细信息,以便可以正确处理,则可以在其中查看。
经过更多的实验后,似乎没有一个针对受限RefCriteria的未记录API端点,该端点也支持获取和更新引用标准。
# my_child.py
import os
import sys
pipename = sys.argv[1]
while True:
with open(pipename, 'rb') as p:
print(p.read())
有趣的是,一旦我知道“ optimized”关键字,就好像在回购名称中使用_optimized一样,本文中所描述的使用_full也可以逆转此功能。例如:
/tfs/*collectionName*/_apis/git/repositories/*repositoryId*/limitedRefCriteria
如果默认情况下未启用该功能,但使用_optimized路径,它将返回已过滤的分支。对于那些不想对设置json进行调整并且只希望通过存储的proc将记录添加到受限引用标准的人来说,这也许是一条更安全的路径。
答案 1 :(得分:1)
我认为值得一提的是,这些东西可在Azure DevOps (托管服务)中使用。
如果您的克隆URL为https://dev.azure.com/*orgname*/*projectname*/_git/*reponame*
,则通过在回购名称前插入_optimized/
(如https://dev.azure.com/*orgname*/*projectname*/_git/_optimized/*reponame*
),您将获得本文所讨论的“过滤的引用”行为。
(对于SSH URL,这是相同的主意,在URL末尾附近的存储库名称前添加_optimized/
)
此外,您可以在limitedRefCriteria
端点上运行GET和PUT,例如在浏览器会话中处理获取请求,以提供除默认分支,用户自己的分支和用户的“收藏夹”之外的其他分支的全局可见性。 '分支和名称空间:
列出存储库的limitedRefCriteria
:
fetch("https://dev.azure.com/*orgname*/_apis/git/repositories/*repoid*/limitedRefCriteria", {"credentials":"include","headers":{"accept":"application/json","x-requested-with":"XMLHttpRequest"},"method":"GET"}).then(r => {return r.json()}).then(d => console.log(d));
设置存储库的limitedRefCriteria
:
fetch("https://dev.azure.com/*orgname*/_apis/git/repositories/*repoid*/limitedRefCriteria", {"credentials":"include","headers":{"accept":"application/json;api-version=6.0-preview.1;","x-requested-with":"XMLHttpRequest",'Content-Type': 'application/json'},"method":"PUT",body:JSON.stringify({refExactMatches:['refs/heads/some-specific-branch'], refNamespaces:['refs/heads/some-branch-prefix/']})}).then(r => {return r.json()}).then(d => console.log(d));
(不幸的是,我是根据上述答案通过反复试验发现的,而不是在线获得的任何文档,因此我必须假定这不受官方支持...?)