ОБНОВЛЕННЫЙ ОТВЕТ
Некоторое время назад к git commit
был добавлен новый аргумент --fixup
, который можно использовать для создания коммита с сообщением журнала, подходящим для git rebase --interactive --autosquash
. Итак, самый простой способ исправить прошлый коммит сейчас:
$ git add ... # Stage a fix
$ git commit --fixup=a0b1c2d3 # Perform the commit to fix broken a0b1c2d3
$ git rebase -i --autosquash a0b1c2d3~1 # Now merge fixup commit into broken commit
ОРИГИНАЛЬНЫЙ ОТВЕТ
Вот небольшой скрипт на Python, который я написал некоторое время назад, который реализует эту git fixup
логику, на которую я надеялся в своем первоначальном вопросе. Сценарий предполагает, что вы сделали некоторые изменения, а затем применяет эти изменения к данному коммиту.
ПРИМЕЧАНИЕ : Этот скрипт предназначен для Windows; он ищет git.exe
и устанавливает переменную окружения GIT_EDITOR
, используя set
. Отрегулируйте это по необходимости для других операционных систем.
Используя этот сценарий, я могу точно реализовать рабочий процесс 'исправление неработающих исходников, исправления этапов, запуск git fixup', который я просил:
#!/usr/bin/env python
from subprocess import call
import sys
# Taken from /372755/proverit-suschestvuet-li-ispolnyaemyi-fail-v-python python
def which(program):
import os
def is_exe(fpath):
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
if len(sys.argv) != 2:
print "Usage: git fixup <commit>"
sys.exit(1)
git = which("git.exe")
if not git:
print "git-fixup: failed to locate git executable"
sys.exit(2)
broken_commit = sys.argv[1]
if call([git, "rev-parse", "--verify", "--quiet", broken_commit]) != 0:
print "git-fixup: %s is not a valid commit" % broken_commit
sys.exit(3)
if call([git, "diff", "--staged", "--quiet"]) == 0:
print "git-fixup: cannot fixup past commit; no fix staged."
sys.exit(4)
if call([git, "diff", "--quiet"]) != 0:
print "git-fixup: cannot fixup past commit; working directory must be clean."
sys.exit(5)
call([git, "commit", "--fixup=" + broken_commit])
call(["set", "GIT_EDITOR=true", "&&", git, "rebase", "-i", "--autosquash", broken_commit + "~1"], shell=True)