typescript Git自动改写分支上的Git提交消息

mm9b1k5b  于 2022-12-24  发布在  TypeScript
关注(0)|答案(3)|浏览(125)

有没有什么方法可以让我在分支上运行一个脚本来改写所有包含特定子字符串的提交消息?假设我有一个repo like this

然后我想改写所有以🚀 build version开头并附加后缀⚠️ (rebased since)的提交消息(在mybranch上而不是main上)。
我可以通过git命令、bash脚本或事件类型脚本(由ts-node或deno触发)来完成吗?

mrfwxfqh

mrfwxfqh1#

您可以像在this answer中那样使用git filter-repo来修改提交消息。
有关简单的解决方案,请参见“更新提交/标记消息
如果你想修改提交或标记消息,你可以使用和上面解释的--replace-text相同的语法,例如,使用一个名为expressions.txt的文件,其中包含

🚀 build version==>🚀 build version ⚠️ (rebased since)

然后运行

git filter-repo --replace-message expressions.txt

但是这不会在提交消息的末尾附加⚠️ (rebased since)
如果您在最后需要它,那么您需要一个commit-callback,就像answer I mentioned before中所做的那样。

qvk1mo1f

qvk1mo1f2#

受@VonC的启发,我创作了这个剧本:
(需要brew install git-filter-repo

#!/bin/bash

# Create a temporary file to store the commit messages
temp_file=$(mktemp)

main_head_hash=$(git rev-parse main)
suffix="⚠️ rebased since!"
# Use git log to retrieve the commit messages and store them in the temporary file
git log --pretty=format:%s $main_head_hash.. | grep -v $suffix | grep '🚀 build version' > $temp_file

# Create a file to store the replacements
echo > replacements.txt

# Iterate over the commit messages in the temporary file
while read commit_message; do
  # Print the replacement message to the replacements.txt file
  echo "$commit_message==>$commit_message $suffix" >> replacements.txt
done < $temp_file

# ⚠️⚠️ Rewriting history ⚠️⚠️
git filter-repo --replace-message replacements.txt --force

# Remove the temporary files
rm $temp_file
rm replacements.txt

(The我的脚本是在chatGPT的帮助下编写的-为编写脚本的步骤提供了明确的说明。我知道temp. ban policy of chatGPT,希望这不会表现为违反政策,因为答案不仅仅基于它,而是从一个有线索和错误的对话中推导出来的-脚本经过验证可以工作,我希望它能帮助其他人)

u5i3ibmn

u5i3ibmn3#

(a)

  • 使用新消息进行空提交
  • 将其压缩到旧提交中

(b)

  • 找出需要的深度
  • 以交互方式基于自身重新定基git rebase -i HEAD~3
  • 将改写的提交更改为exec 310154e tsx reword-commit.ts
  • 使reword-commit.ts用提交消息重写文件
  • 您可以通过execa或其他任何ts shell启动器https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History从TS运行该命令

相关问题