Я закончил тем, что сделал, по существу, то, что предложил Джефроми. Я написал этот код на Python, назвав его git-bisect.py:
#!/usr/bin/env python
from subprocess import Popen, PIPE
from sys import stderr
def run_command(cmd):
p = Popen(cmd, stdout=PIPE, stderr=PIPE)
output, errors = p.communicate()
if p.returncode:
raise Exception(errors)
def process_all(filename):
with open(filename) as f:
all_files = [fn.strip() for fn in f]
try:
for i, f in enumerate(all_files, start=1):
print >> stderr, i, f
run_command(['git', 'add', f])
run_command(['git', 'stash', '--keep-index'])
run_command(['bin/login_test.sh'])
run_command(['git', 'stash', 'pop'])
except Exception, exc:
print >> stderr, exc
if __name__ == '__main__':
from sys import argv
for filename in argv[1:]:
process_all(filename)
И запустил его по списку файлов, которые были затронуты.
Вот мой полный рабочий процесс:
# Get the commit just before things went bad
git checkout 8f5c3d7
# Diff good code against bad, make patch
git diff 8f5c3d7 cb8ddf0 > 8f5c3d7-cb8ddf0.patch
# Apply patch
git apply 8f5c3d7-cb8ddf0.patch
# Now my index has all the changes that went into the bad commit
# but with just a dirty index.
# Run code that finds bad file in commit
python ~/Dropbox/src/git-bisect.py ~/Dropbox/src/bad-commit.txt
И это продолжалось до тех пор, пока не остановилось на первом плохом файле. Тогда я бы просто:
git reset --hard HEAD
и повторно примените патч, поместите неверный файл в конец списка файлов и начните сначала. Вскоре я узнал файл, в котором были изменения, которые сломали мою сборку.