Извлечь изменения в один файл в диапазоне коммитов git

Система сборки, с которой я работаю, обычно требует, чтобы данные проекта были зафиксированы в локальном репозитории, прежде чем можно будет выполнить полную сборку. Это - наряду с моей обычной привычкой часто совершать коммиты и переустанавливать перед отправкой в ​​публичное репо - означает, что у меня обычно есть стек коммитов поверх удаленной головы. У большинства из них есть сообщения о фиксации типа «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 отличные, но я не занимаюсь заменой ключевых слов, и я не думаю, что изменения, которые я хочу сохранить в моей личной ветке, будут достаточно предсказуемыми для сценария. Я думаю, что мне всегда нужно быть хотя бы на один коммит впереди публичного мастера.

person David Dombrowsky    schedule 16.03.2011    source источник
comment
фильтр-ветка? Я бы предпочел драйвер фильтра (stackoverflow.com/questions/2673232/) и использовал --autosquash (stackoverflow.com/questions/2302736/)   -  person VonC    schedule 16.03.2011


Ответы (1)


http://technosorcery.net/2010/02/07/fun_with_the_upcoming_1.7_release_of_git_rebase_--interactive_--autosquash.html

Это должно рассказать вам, как делать автосжатие. Вместо того, чтобы отмечать коммит с помощью s, пометьте его с помощью! Squash.

Похоже, вы должны поддерживать свою собственную ветку для всех коммитов DD. Тогда просто управляйте слиянием с основной веткой.

Если изменения в файле, который вы хотите исключить, связаны с настройкой среды, посмотрите вместо этого скрипты smudge / clean. Это позволит вам зафиксировать соответствующие изменения в этом файле и пропустить любые изменения, относящиеся только к вашей среде. Обычно это строки подключения к базе данных, которые отличаются от одного разработчика к другому.

Взгляните сюда: http://progit.org/book/ch7-2.html

person Adam Dymitruk    schedule 16.03.2011
comment
Я не знал об автосквоше. Я буду использовать это с этого момента. Но это не касается моего первоначального вопроса о том, как автоматически отделить изменения в конкретном файле от диапазона коммитов. - person David Dombrowsky; 17.03.2011