Система сборки, с которой я работаю, обычно требует, чтобы данные проекта были зафиксированы в локальном репозитории, прежде чем можно будет выполнить полную сборку. Это - наряду с моей обычной привычкой часто совершать коммиты и переустанавливать перед отправкой в публичное репо - означает, что у меня обычно есть стек коммитов поверх удаленной головы. У большинства из них есть сообщения о фиксации типа «s», потому что я знаю, что они будут раздавлены.
Ситуация, которую я здесь имею, заключается в автоматизации одного из шагов по изменению размера списка коммитов. Я знаю, что все изменения, которые я вношу в определенный файл, не следует помещать в общедоступное хранилище, и я искал способ редактировать каждую фиксацию, чтобы разделить изменения в этом файле на отдельные коммиты, которые я буду раздавить позже. перебазировать.
Например, вот коммиты, которые у меня есть наверху, если исходная HEAD:
* 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, извлечь изменения в ./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 с основной веткой», переупорядочил их, обновил master , и нажмите на источник, в конечном итоге получив:
* ------- (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, но я не могу понять, как это сделать.
РЕДАКТИРОВАТЬ:
- --autosquash устраняет раздражение коммитов "s", но это не главный вопрос. Я до сих пор не знаю, как разделить изменения в конкретном файле, что должно произойти до, как я их подавлю.
- фильтры smudge / clean отличные, но я не занимаюсь заменой ключевых слов, и я не думаю, что изменения, которые я хочу сохранить в моей личной ветке, будут достаточно предсказуемыми для сценария. Я думаю, что мне всегда нужно быть хотя бы на один коммит впереди публичного мастера.
--autosquash
(stackoverflow.com/questions/2302736/) - person VonC   schedule 16.03.2011