Редактировать коммит с помощью gitpython

Допустим, вы находитесь в терминале, в настоящее время сидите в корне git-репо.

Если у вас установлен 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 здесь вы увидите, что сообщение о фиксации остается нетронутым. Как мне отредактировать коммиты с этой библиотекой?

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-заметки, которые можно редактировать независимо от коммита, к которому они прикреплены. Но это явно не то, что вы имеете в виду, и я все еще не видел, чтобы кто-нибудь действительно использовал их в любом случае.

Другие вопросы по тегам