Git - как удалить файл из одной ветки - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть репозиторий, в котором есть главная ветвь, которая в конечном итоге будет содержать «ядро» этого приложения, а также клиентские ветки, которые будут содержать ядро, и, кроме того, открытая сторона, которая содержит все ресурсы, стили и фронтКонец просмотров.Я знаю, что это можно сделать, поскольку я проверил это с локальным репо.НО проблема в том, что я начинаю с полностью построенного клиентского приложения, я хочу вырезать несколько папок из главной ветви без распространения этих удалений в другие ветви, когда я объединяю их с клиентскими ветвями, обновляяядро системы.

Итак, более простыми словами: как удалить файл из одной ветви без распространения, который удаляет другие ветви после слияния?

Ответы [ 4 ]

2 голосов
/ 02 февраля 2011

IMO, вы должны использовать подмодули для разделения специфики клиента (активы и т. Д.). Ручное обращение с этим - приглашение к катастрофе

Создайте отдельный репозиторий для каждого клиента и добавьте подмодуль, указывающий на ваше ядро, и на все остальное, что совместно используется ими. Код, который не разделяется между клиентами, не должен принадлежать ни ядру, ни другим совместно используемым подмодулям. Это означает, что каждая (текущая) ветвь, соответствующая клиенту, должна стать отдельным хранилищем. Ведь они независимы друг от друга, и в этом весь смысл.

В итоге вы получите эту иерархию хранилища:

       core
        /\
       /  \
client1    client2

UPDATE :

ВАЖНО: сделайте резервную копию всего, чтобы не было проблем, если что-то пойдет не так.

Все это сильно зависит от вашего сценария. Но ниже приводится идея о том, как выполнить то, что я описал в системе, отличной от Windows:

1) Разделить ваш текущий репозиторий на различные репозитории (например: core, client1, client2 и т. Д.):

cp -R original_repo copy_repo
cd copy_repo
git checkout desired_branch
git filter-branch --prune-empty --subdirectory-filter desired_directory -- --all

Повторите это также для каждого клиентского каталога. В конце этого шага у вас будет отдельный репозиторий для каждой из этих частей (core, client1, client2 и т. Д.).

2) Добавьте новый разделенный репозиторий ядра в качестве подмодуля к каждому из ваших репозиториев client1..clientN:

git submodule add <path_for_core_alone>
git submodule init # Add the submodule to .git/config
git submodule update # Clone the core repository

3) Кофе и прибыль.

1 голос
/ 02 февраля 2011

Вы можете удалить файл в банке, но вместо слияния вашей ветви в «Ядро», вы можете объединить «базовую» банку В вашу ветку с удаленным файлом.Таким образом, они всегда будут синхронизированы, но все удаленные вами файлы будут удаляться только в указанных ветвях.

0 голосов
/ 04 февраля 2011

В итоге я просто создал новый репозиторий для ядра и переделал ветви клиента, так как эта структура была запоздалой мыслью.Поэтому я пытался сделать это задом наперед.

0 голосов
/ 02 февраля 2011

Я не пользователь git, но в общем и целом я считаю, что вы должны иметь возможность удалить файл из ствола, а затем во время слияния из ствола в ветвь отменить это изменение (например, сохранить или восстановить файл врабочая копия), а затем совершить слияние.Набор изменений должен рассматриваться как объединенный с веткой уже в будущих объединениях.

...