2010-06-11 6 views
2

Моя компания находится в середине перехода от CVS к git. Мы долгое время работали на CVS, поэтому существует огромная история. Слишком много, чтобы сделать это вручную.Massive git commit squashing

Глядя на бревна, есть много раздавливаний, которые можно было бы сделать. Много. То, что я хотел бы сделать, это зацепить скрипт, который будет сравнивать два смежных коммита. Если он возвращает true, то конкатенируйте сообщения фиксации и раздавите коммиты. Я также был бы доволен командой, которая принимает два коммита и сообщение фиксации, а затем сжимает их вместе.

git rebase --interactive близок к тому, что мне нужно, но для «сквоша» требуется слишком много ручного вмешательства. Я также рассмотрел использование «fixup» вместо squash, но я не хочу потерять сообщения фиксации.

Любые идеи?

ответ

2

Как насчет --autosquash?

Вы можете объединить его с веткой фильтра git, чтобы сценарий переименовал коммиты. (Предупреждение. Будьте осторожны с веткой фильтра и прочитайте предупреждения на своей странице руководства. Это не команда для слабонервных.)

+0

Я мог ошибаться, но это все равно не решит проблема «Конкатенация сообщений». Autosquash выглядит так же, как squash/fixup, но на основе сообщения commit. – Nycto

+0

На самом деле, вы могли бы просто использовать фильтр-ветку, полностью забыть о rebase -autosquash. – dublev

+0

Ваше предложение об фильтрующей ветке оказалось верным. Использование флага «commit-filter» позволяет обрабатывать каждую фиксацию во всем репо. Внутри сценария обратного вызова, с которым вы проходите, вы можете передать сообщение в команду commit-tree, чтобы изменить сообщение фиксации. Вы также можете вызвать skip_commit, чтобы объединить текущую фиксацию в следующую фиксацию. – Nycto