Система сборки, с которой я работаю, обычно требует, чтобы данные проекта были переданы в локальный репозиторий, прежде чем можно будет выполнить полную сборку. Это - наряду с моей обычной привычкой часто совершать коммиты и делать перебазирование перед отправкой в публичное репо - означает, что у меня обычно есть стек коммитов поверх удаленной головы. У большинства из них есть сообщения коммитов типа "s", потому что я знаю, что они будут раздавлены.
Ситуация, с которой я столкнулся, заключается в автоматизации одного из шагов по перебазированию списка коммитов. Я знаю, что все изменения, которые я делаю в определенном файле, не должны передаваться в общедоступное хранилище, и я искал способ отредактировать каждый коммит, чтобы разделить изменения в этом файле на отдельные коммиты, которые я расскажу позже. перебазироваться.
Например, вот коммиты, которые у меня есть сверху, если заголовок источника:
* 6f42745 (HEAD, master-dave) s
* b33bc68 s
* 0b787e8 s
* 3d47e9e s
* ae45dec brought pkg up-to-date with master branch
* dd87ec1 s
* 96fd4ef DD: dave dev
* 422cf73 (origin/master, master) Add missing build scripts.
Я хочу перебрать все коммиты от master..master-dave, extract
изменяется на ./file.txt, давая мне:
* 6f42745 (HEAD, master-dave) s
* ------- DD (changes to file.txt)
* b33bc68 s
* ------- DD (changes to file.txt)
* 0b787e8 s
* ------- DD (changes to file.txt)
* 3d47e9e s
* ae45dec brought pkg up-to-date with master branch
* dd87ec1 s
* 96fd4ef DD: dave dev
* 422cf73 (origin/master, master) Add missing build scripts.
И, наконец, я бы запустил git rebase -i origin / master, раздавил все
"DD" фиксируется вместе, все "s" фиксируются в "обновленном pkg с главной веткой",
переупорядочьте их, обновите мастер и нажмите на начало координат, в конечном итоге получив:
* ------- (HEAD, master-dave) DD: dave dev
* ------- (origin/master, master) brought pkg up-to-date with master branch
* 422cf73 Add missing build scripts.
Я почти уверен, что ответ лежит в git filter-branch, но я не могу понять, как.
EDIT:
- - autosquash исправляет раздражение коммитов "s", но это не главный вопрос. Я до сих пор не знаю, как выделить изменения в конкретном файле, что должно произойти до Я их раздавлю.
- Фильтры smudge / clean изящны, но я не делаю замену ключевых слов, и я не думаю, что изменения, которые я хочу сохранить в моей личной ветке, будут достаточно предсказуемыми для сценария. Я думаю, что мне всегда нужно быть хотя бы на один коммит впереди публичного мастера.