Извлечь изменения в один файл в диапазоне git коммитов - PullRequest
4 голосов
/ 16 марта 2011

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

1 Ответ

0 голосов
/ 16 марта 2011

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

...