如何在Windows上使用SourceTree配置“提交文本链接”功能以跨多个代码库

6
TL;DR: SourceTree最近添加了“提交文本链接”功能,但似乎替换必须针对每个存储库设置。是否有一种方法可以全局应用它们或者修改可编程的配置文件来设置它们?
详细版本:提交文本链接功能看起来非常有用,但我有一个小问题:我们有大约十几个JIRA项目和超过25个存储库,每个存储库都可能与它们中的一个相关(它们都不是1对1的映射)。虽然我可以设置单个正则表达式来匹配每个JIRA项目,但要求所有开发人员通过UI为每个存储库设置它似乎有点过分要求。为了真正利用这一点,理想情况下我需要能够向他们提供有关修改单个文件的说明,或者我需要生成一个设置脚本,以便我可以将其分发给我们的开发人员。
这个设置保存在哪个配置文件中?我希望在像.hg/hgrc这样的文件中找到它,但我找不到任何东西。我也找不到SourceTree程序文件夹中相关的设置。
或者,是否有一种可以应用于所有存储库的全局或默认设置?如果仍需手动操作,这加上正则表达式版本可能会使设置显著减少痛苦。
谢谢!(注:我使用的是SourceTree for Windows的1.3.3.0版本,我相信这是最新稳定版本)

我也遇到了这个问题,我正在尝试找出最佳方法;而不是多次复制+粘贴,然后尝试将其提交到git的sourcetree配置中。 - askrich
我也在"Atlassian Answers"网站上提出了这个问题,但那里也没有得到回复。最终,我手动设置了我个人最常用的存储库,并就此结束了。 - Josh
我采用的方法是使用一个大正则表达式。最终变成了类似于((a|b|c|d)-\d+),然后将其作为手动替换链接粘贴到不同的代码库中。虽然有些取巧,但比在每个代码库中添加5个项目要容易得多。 - askrich
改进后的正则表达式为:([a-zA-Z]*-\d+)。但是这个表达式显然会匹配形如AAAA-####的任何内容。 - askrich
2个回答

6

也许有点晚了,但我找到了一个相对简单的方法来实现这个。

在您的仓库中的 .hg/.git 文件夹下应该存在一个名为 'sourcetreeconfig' 的文件。这里是链接所在的位置,可以手动编辑。

首先确保您已经关闭了所有现有的 sourcetree 仓库标签,并在此之后关闭 sourcetree。然后,(假设您已经配置了一个仓库)从相应仓库的 sourcetreeconfig 中复制块,并在您所有的 sourcetreeconfig 文件上进行替换。如果您有多个与同一项目相关联,则需要这样做。很容易组合出一个为不同项目进行配置的工具,只需替换配置中的 url/project。

重新打开 sourcetree 后,您的每个仓库都应该反映此更改。

这是使用 sourcetree 的版本 1.6.5.0 执行的。


2

程序化解决方案

截至2019年底,Sourcetree 3.2.6 for Windows仍然没有全局配置提交文本链接的功能。由于这个问题是唯一一个有不错答案的搜索结果之一,我想添加一个自动化解决方案到答案中。虽然我不是程序员,而且我知道正则表达式并不是最好的,但是我拼凑在一起的这个简单的PowerShell脚本可以完成任务。在运行脚本之前,请确保关闭Sourcetree。

  1. sourcelinker脚本复制到Notepad++或类似的文本编辑器应用程序中。
  2. 为了获取您设置的特定字符串,请使用一个或多个提交文本链接来配置您的Git存储库。
    A. 启动Sourcetree,选择一个Git存储库,然后点击设置
    B. 在存储库设置窗口中,点击高级选项卡。
    C. 在提交文本链接区域中,点击添加
    D. 从替换类型下拉列表中选择其他
    E. 输入正则表达式模式链接到URL以获取您的特定设置,然后点击确定
    F. 在存储库设置窗口中,点击确定
    G. 关闭Sourcetree
    1. 导航到您配置的存储库的.git子目录,并打开sourcetreesonfig.json
    2. 复制从"CommitTextLinks": [开始到结束括号和逗号],的所有内容。例如:
"CommitTextLinks": [
    {
      "$id": "11",
      "LinkType": 99,
      "Regex": "[fF][bB][#\\s]*(\\d+)",
      "LinkToUrl": "https://companyname.fogbugz.com/f/cases/$1",
      "Project": null,
      "RootUrl": null,
      "Description": "[fF][bB][#\\s]*(\\d+) => https://companyname.fogbugz.com/f/cases/$1"
    }
  ],
  1. 将复制的内容粘贴到你的sourcelinker脚本中,在跟随的单引号之间$New1 =
  2. 将脚本保存为sourcelinker.ps1
  3. sourcelinker.ps1复制到存放Git仓库的根文件夹中。
  4. 右键单击脚本,选择使用PowerShell运行
  5. 启动Sourcetree,并检查其他Git仓库的提交文本链接

Sourcelinker脚本

此脚本示例包含与Fogbugz相关的正则表达式示例,并处理以下变化:

  • case12345
  • fb12345
  • bugzid12

脚本

# Sourcelinker script
$InputFiles = Get-Item ".\*\.git\sourcetreeconfig.json"
$Old1 = '"CommitTextLinks": null,'
$New1 = '"CommitTextLinks": [
    {
      "$id": "9",
      "LinkType": 99,
      "Regex": "[bB][Uu][gG][sSzZ]\\s*[Ii][Dd]s?\\s*[#:; ]+(\\d+)",
      "LinkToUrl": "https://companyname.fogbugz.com/f/cases/$1",
      "Project": null,
      "RootUrl": null,
      "Description": "[bB][Uu][gG][sSzZ]\\s*[Ii][Dd]s?\\s*[#:; ]+(\\d+) => https://companyname.fogbugz.com/f/cases/$1"
    },
    {
      "$id": "10",
      "LinkType": 99,
      "Regex": "[cC][aA][Ss][Ee]+\\s*(\\d+)",
      "LinkToUrl": "https://companyname.fogbugz.com/f/cases/$1",
      "Project": null,
      "RootUrl": null,
      "Description": "[cC][aA][Ss][Ee]+\\s*(\\d+) => https://companyname.fogbugz.com/f/cases/$1"
    },
    {
      "$id": "11",
      "LinkType": 99,
      "Regex": "[fF][bB][#\\s]*(\\d+)",
      "LinkToUrl": "https://companyname.fogbugz.com/f/cases/$1",
      "Project": null,
      "RootUrl": null,
      "Description": "[fF][bB][#\\s]*(\\d+) => https://companyname.fogbugz.com/f/cases/$1"
    }
  ],'
$InputFiles | ForEach {
    (Get-Content -Path $_.FullName).Replace($Old1,$New1) | Set-Content -Path $_.Fullname
}

这个解决方案的灵感来自于Andrew Pearce在此帖子中的建议


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