什么';编辑数百条Git提交消息的最快方法是什么?

什么';编辑数百条Git提交消息的最快方法是什么?,git,Git,我有一个相当大的Git存储库,包含1000次提交,最初是从SVN导入的。在我公开我的回购协议之前,我想清理几百条在我的新回购协议中没有意义的提交消息,并删除所有添加的git svn信息文本 我知道我可以使用'git-rebase-I'和'git-commit-amend'来编辑每个提交消息,但是由于要编辑数百条消息,这是一个巨大的痛苦 有没有更快的方法来编辑所有这些提交消息?理想情况下,我会将每个提交消息都列在一个文件中,这样我就可以在一个地方编辑它们 谢谢 这很容易做到,如下所示: 执行第一

我有一个相当大的Git存储库,包含1000次提交,最初是从SVN导入的。在我公开我的回购协议之前,我想清理几百条在我的新回购协议中没有意义的提交消息,并删除所有添加的git svn信息文本

我知道我可以使用'git-rebase-I'和'git-commit-amend'来编辑每个提交消息,但是由于要编辑数百条消息,这是一个巨大的痛苦

有没有更快的方法来编辑所有这些提交消息?理想情况下,我会将每个提交消息都列在一个文件中,这样我就可以在一个地方编辑它们


谢谢

这很容易做到,如下所示:

  • 执行第一次导入
  • 将所有提交导出为文本:

    git format-patch -10000
    
    数量应大于提交总数。这将创建许多名为
    NNNNN-commit-description.patch
    的文件

  • 使用一些脚本编辑这些文件。 (除带有提交消息的顶部外,请勿触摸其中的任何内容)
  • 将编辑的文件复制或移动到空的git回购或分支
  • 将所有已编辑的提交导入回:

    git am *.patch
    

<>这将只适用于单分支,但它工作得很好。

< P>作为替代,考虑跳过整个存储库的导入。我会简单地签出、清理和提交历史上的重要点。

这是一个老问题,但由于没有提到
git过滤器分支,我只加了两分钱

我最近不得不批量替换提交消息中的文本,在不更改其余提交消息的情况下,用另一个文本块替换一个文本块。例如,我必须用Refs:#22917替换Refs:#xxxxx

我像这样使用了
git过滤器分支

git filter-branch --msg-filter 'sed "s/Refs: #xxxxx/Refs: #22917/g"' master..my_branch
  • 我使用选项
    --msg filter
    仅编辑提交消息,但您可以使用其他筛选器更改文件、编辑完整提交信息等
  • 我限制了
    筛选器分支
    ,只将其应用于主控(
    master..my_branch
    )中不存在的提交,但您可以通过忽略提交范围将其应用于整个分支
按照文档中的建议,在分支机构的副本上尝试此操作。 希望有帮助


答案的来源

  • 关于何时使用该功能的用例:
  • 功能参考(带有选项列表):
  • 重写示例:

您可以使用
git-rebase-i
并将
pick
替换为
reword
(或仅
r
)。然后git在每次提交时都会停止重定,这样您就有机会编辑消息


唯一的缺点是,您不能一次看到所有消息,并且在发现错误时无法返回。

一个很好且简单的方法是在python脚本中使用
git filter branch--msg filter”“

python脚本将如下所示:

导入操作系统
导入系统
进口稀土
pattern=re.compile(“(?i)问题-\d{1,4}”)
commit_id=os.environ[“GIT_commit”]
message=sys.stdin.read()
如果len(消息)>0:
如果模式为.search(消息):
消息=模式连接1.sub(“问题”,消息)
打印消息
您将进行的命令行调用是git filter branch-f--msg filter“python/path/to/git script.py”
现在建议使用git filter repo。我是这样使用的:

PS C:\repository>git filter repo--commit回调'
>>msg=commit.message.decode(\“utf-8\”)
>>newmsg=msg.replace(\“旧字符串\”,\“新字符串\”)
>>commit.message=newmsg.encode(\“utf-8\”)
>>”“武力
用328.30秒写出新的历史;现在重新包装/清洁。。。
重新打包回购并清除旧的不需要的对象
头部现在在087f91945a等等
枚举对象:346091,完成。
计数对象:100%(346091/346091),完成。
增量压缩最多使用8个线程
压缩对象:100%(82068/82068),完成。
书写对象:100%(346091/346091),完成。
总计346091(增量259364),重复使用346030(增量259303),包装重复使用0
443.37秒后完全完成。
PS C:\repository>
您可能不想复制powershell额外的东西,因此以下是命令:

git过滤器repo——提交回调'
msg=commit.message.decode(\“utf-8\”)
newmsg=msg.replace(\“旧字符串\”,\“新字符串\”)
commit.message=newmsg.encode(\“utf-8\”)
”“武力

如果要点击所有分支,请不要使用
--refs HEAD
。如果不想使用
--force
,可以在干净的
git克隆上运行它--不签出。这让我开始了:

似乎很有希望,谢谢!不幸的是,我在运行'git am*.patch'时遇到了一个“错误文件号”错误。我使用的是Windows7,谷歌的快速搜索似乎表明这与超过命令行参数的最大数量有关,考虑到每次提交都有一个补丁文件,这是有道理的。我稍后会在我的Mac电脑上试用。你可以分小批进行,只需确保递增
ls*.patch | xargs git am
的顺序会自动完成。当然,但在windows上,你必须先安装mingw或cygwin。在Linux或Mac上启动此操作要容易得多。使用“git am--committer date是author date”来保留提交日期这不是一种方法。每次打开1000条提交消息大约需要8.5小时才能完成所有操作。每天大约30秒message@Whitecat我误解了这个问题,所以你想要做一些手动清理,但你想要一些自动化的东西。那么中提到的
git filter branch
有什么问题?我对
git filter patch
有一个问题,它只显示补丁,而不是提交。我有6000多条要更改的提交邮件。但是当我使用git filter patch-100000头时,我只得到500个补丁文件。@Whitecat这很奇怪。我刚刚尝试了git过滤器-