(Да, я понимаю, что этому больше года. Но я имею дело с чем-то похожим, поэтому позвольте мне поделиться своими мыслями в надежде, что это кому-нибудь поможет).
Ну, вы можете это сделать.Есть несколько подходов, но все они сложны.Но я думаю, что это окажется самым простым:
Внесение изменений извне вашего хранилища не является проблемой (при условии, что никто не добавляет те же файлы, которые вы делаете локально).Просто объедините или перебазируйте как обычно.Но публикация без ваших файлов немного сложнее.
Во-первых, вы захотите найти самый ранний коммит, в который вы добавили материал, который вы не хотите публиковать.Допустим, это 1abcdef.Нам очень нужен родитель этого коммита, поэтому давайте создадим ветку для ссылки на него:
git branch before_publish 1abcdef^
Внимательно обратите внимание на ^ в конце строки.Если вы используете windows и cmd.exe, вам придется заключить его в кавычки со вторым символом ^, то есть ^^, поскольку cmd.exe использует ^ в качестве символа продолжения строки ....
ДалееДавайте создадим и извлечем ветку для публикации (при условии, что мы уже извлекли ветку, из которой мы хотим публиковать):
git checkout -b publish
Теперь самое интересное.Мы хотим избавиться от этой ветки от поврежденных файлов.
git filter-branch -f --index-filter 'git rm -r -f --quiet --cached --ignore-unmatch <your list of files and directories here>' before_publish..publish
ОК, это даст вам ветку без дополнений, которые вы не хотите публиковать.Затем вы можете объединить или перебазировать эти изменения поверх основной ветви, с которой вы начали, и протолкнуть их, как обычно, в соответствии с вашим рабочим процессом.
Обратите внимание, что это может оставить ваше рабочее дерево с некоторыми остатками -пустые каталоги или каталоги, содержащие файлы, которые были исключены или не отслежены.Но они ушли из ветви.
Последний шаг, конечно же, состоит в том, чтобы снова проверить исходную рабочую ветку.
В следующий раз вы можете повторить процесс - ноВы также можете объединить только изменения, внесенные с тех пор.Чтобы облегчить это, вы можете переместить before_publish, чтобы указать текущую главу публикации, и добавить ветку, чтобы отслеживать, где вы в последний раз слились в вашей рабочей ветке.
Вы не сможете напрямую использовать «git merge» - вам придется использовать:
git checkout publish
git branch -f before_publish
git cherry-pick last_published..my-main-branch
git filter-branch ... before_publish..publish
git checkout my-main-branch
git branch -f last_published
Это немного сложнее, но избавляет вас от необходимостинеоднократно создавать новые коммиты для всей истории ваших дополнительных файлов.Это, вероятно, не стоит делать, если вы делаете что-то недолгое.
Вы также можете сделать это, чтобы отменить удаление!Вместо того, чтобы делать git rm, используйте его, git reset.Вы будете использовать его для извлечения отсутствующих файлов и каталогов с того времени, когда они еще существовали:
git filter-branch -f --index-filter 'git reset --quiet before_publish -- <paths to restore>' before_publish..publish
Конечно, вы можете (и должны) объединить оба в одной операции 'git filter-branch', есливам нужны оба.