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