批量搜索和替换 git 提交消息中的问题链接,同时忽略分支名称

问题描述 投票:0回答:1

我正在 git 存储库中批量搜索和替换数千条提交消息。本质上,我的目标是将存储库的 Jira 问题链接恢复到新的 Jira 项目密钥。

Old project key: TEST
New project key: TESTPSW

我想要替换的以下文本可以位于提交消息中的任何位置。假设“X”指的是任意数字(0-9)

替换品:

TEST-X -> TESTPSW-X
TEST-XX -> TESTPSW-XX
TEST-XXX -> TESTPSW-XXX
TEST-XXXX -> TESTPSW-XXXX
TEST-XXXXX -> TESTPSW-XXXXX
TEST_X -> TESTPSW-X
TEST_XX -> TESTPSW-XX
TEST_XXX -> TESTPSW-XXX
TEST_XXXX -> TESTPSW-XXXX
TEST_XXXXX -> TESTPSW-XXXXX
TEST=X -> TESTPSW-X
TEST=XX -> TESTPSW-XX
TEST=XXX -> TESTPSW-XXX
TEST=XXXX -> TESTPSW-XXXX
TEST=XXXXX -> TESTPSW-XXXXX

当分支名称中包含“TEST-”时,我需要忽略它的使用。有数以千计的提交,其出现的位置/方式具有不同的语法,以下是一些示例:

Finish merge branch 'master' into TEST-3316-support-configurable-.....
Merge remote-tracking branch 'origin/master' into TEST-3390-refactor-.....
Merge pull request #497 in TEST_SW/test from TEST-3316-support-configurable-....
Merge pull request #549 in TEST_SW/test from bugfix/TEST-3419-mfa-s-....
Merge branch 'master' of ssh://*******.***.******.com:7999/test_sw/test into feature/TEST-973-hw-monitor-....
Merge branch 'feature/TEST-3421/refactor-sensor-code' of ssh://*******.***.******.com:7999/test_sw/test into feature/TEST-973-hw-monitor-....
Merge pull request #559 in TEST_SW/test from TEST-3436-add-additional-utilities-.....

还忽略 TEST-SCD 用法:

TEST-SCDX
TEST-SCDXX
TEST-SCDXXX
TEST-SCDXXXX
TEST-SCDXXXXX

以下 powershell 命令是我到目前为止所使用的。这将成功执行 TEST-X -> TESTPSW-X(以及 XX、XXX、XXXX 和 XXXXX)的搜索和替换。但这并没有完成其他替换,并且不会忽略上面写的示例,我希望我的搜索和替换忽略这些示例。

PS C:\_\test> git filter-repo --commit-callback '
>> msg = commit.message.decode(\"utf-8\")
>> newmsg = msg.replace(\"TEST-\", \"TESTPSW-\")
>> commit.message = newmsg.encode(\"utf-8\")
>> ' --force

我相信我可以使用某种正则表达式来完成上面列出的所有替换,同时也满足所有忽略。我将不胜感激任何关于如何编写正则表达式来执行此操作的帮助,或者关于是否可能的建议。

谢谢!

string git powershell replace jira
1个回答
0
投票

参见:https://pythonexamples.org/python-re-sub/

请尝试这个正则表达式,

(?<!TEST-SCD)(?<!branch \'\w+/)
表示匹配项前面没有“TEST-SCD”或“branch 'any_word/”。
lambda m: m.group(0).replace(\"TEST\", \"TESTPSW\")
将“TEST”替换为“TESTPSW”。参考:Python lambda 与正则表达式

git filter-repo --commit-callback '
>> import re
>> msg = commit.message.decode(\"utf-8\")
>> newmsg = re.sub(r\"(?<!TEST-SCD)(?<!branch .+/)(TEST[-_=]\d{1,5})\", lambda m: m.group(0).replace(\"TEST\", \"TESTPSW\"), msg)
>> commit.message = newmsg.encode(\"utf-8\")
>> ' --force

测试一下并告诉我这是否适合您。

© www.soinside.com 2019 - 2024. All rights reserved.