【问题标题】:Edit a commit with gitpython使用 gitpython 编辑提交
【发布时间】:2012-12-29 02:02:11
【问题描述】:

假设您在终端中,当前位于 git repo 的根目录中。

如果你已经安装了GitPython,你可以这样做来获取最后提交的提交,或者更确切地说,是 HEAD 指向的提交:

>>> import git
>>> r = git.Repo('.')
>>> c = r.head.commit
>>> c
<git.Commit "62e71e8210d0d0275b1f5845bf3033a7bfa3ed73">
>>> c.message
u'old message'
>>> c.message = "new message"
>>> c.message
'new message'

但是,如果您退出 python 并在此处输入git log,您将看到提交消息保持不变。如何使用此库编辑提交?

【问题讨论】:

  • 我在这方面取得了一些进展:stackoverflow.com/questions/11987914/… 仍在尝试清理 api。这感觉就像诉诸 subprocess,但至少在这个库中对 filter-branch 有某种钩子。

标签: python git gitpython


【解决方案1】:

您不能编辑 git 提交。这是git 合同的一部分。

可以将 git 提交替换为新提交。这就是git commit --amend 所做的事情:它回溯上次提交,将更改与您所做的新更改结合起来,然后从组合中进行全新的提交。 git rebase 和其他任何声称“改变”历史的东西都是一样的。

所以你必须在这里做同样的事情:将分支指针移回一个提交,重用相同的树对象,并使用不同的消息提交它。请记住,您会搞砸任何看到该提交的人; 永远不要更改已发布的历史记录。

我根本不知道这个库,但是文档中的示例组合可能会满足您的需求:

branch = r.head.reference
commit = r.head.commit
branch.commit = commit.parents[0]
# This works because the index is unchanged by the `branch.commit`
# edit, but it won't work if you're trying to change a commit on
# another branch -- you can't really do that
new_commit = repo.index.commit(u"new message")

新提交将具有不同的哈希,但应包含相同的更改并具有新消息。 谨慎行事,我的大胆的话很重要,改变历史是 不平凡的操作,你应该明白你在做什么。


* 好吧,有 git "notes" 可以独立于它们所附加的提交进行编辑。但这显然不是你的意思,而且我还没有看到有人真正使用它们。

【讨论】:

  • 这对我不起作用。这只会创建一个新的空白提交。新提交只有提交消息,但没有原始文件。它甚至会重置作者。
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 2019-08-06
  • 2017-02-12
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
相关资源
最近更新 更多