我正在 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
我相信我可以使用某种正则表达式来完成上面列出的所有替换,同时也满足所有忽略。我将不胜感激任何关于如何编写正则表达式来执行此操作的帮助,或者关于是否可能的建议。
谢谢!
参见: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
测试一下并告诉我这是否适合您。