Как правильно управлять изменениями в Android-источнике?

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

Каков наилучший способ справиться с этим? Как я могу иметь надлежащий контроль источника моих "личных" изменений, но в то же время быть в состоянии использовать синхронизацию репо, чтобы у меня были последние изменения?

Могу ли я иметь локальные ветви (для каждого проекта, в котором я делаю изменения) и просто объединяться из основной ветви в мои локальные ветви после каждой синхронизации репо?

4 ответа

Кажется, это работает для меня.

Сначала упомяну некоторые настройки

# cd to root of source tree
repo start MyBranch       # Create working branch for all projects
repo checkout MyBranch    # switches all projects to use MyBranch

Проходит время, невероятные правки сделаны и совершены (в MyBranch), рабочая ветка чистая. Теперь хочу изменения вверх по течению...

# Current active branch is "MyBranch"
# The following sync -d as per repo docs:
#     -d: switch specified projects back to the manifest revision.
#      Helpful if the project is currently on a topic branch,
#      but the manifest revision is temporarily needed.
# In other words, it automatically syncs default manifest's upstream
repo sync -d -j12

# Active branch may be "MyBranch" or possibly a detached head or whatever.
# So, if necessary, switch back to MyBranch
# - I usually do this just to make sure all projects are in MyBranch
# - NOTE: If a new project appears it won't have MyBranch
repo checkout MyBranch

# Now we're in MyBranch. Its "upstream" is our local master so sync it.
# - This is usually rather quick
repo sync

"Repo sync -d" может быть необязательным, но, насколько я видел, проблем не возникло. Кроме того, он вытягивает основную кодовую линию локально, чтобы синхронизировать ее для удобных различий и тому подобного.

Возможно, "синхронизация репозитория" из MyBranch также делает это. Но я не получаю никаких обновлений, когда пропускаю шаг "repo sync -d" и просто делаю "repo sync", когда MyBranch извлечен. (Хотя, может быть, моя локальная установка как-то испорчена)

Подвести итоги:

Вариант А: может работать

cd RootOfRepoSourceTree   # wherever you have it
repo checkout MyBranch
repo sync

Вариант Б: работает последовательно для меня

cd RootOfRepoSourceTree   # wherever you have it
repo sync -d -j12
repo checkout MyBranch
repo sync

Используйте геррит в сочетании с репо и мерзавцем.

Вам нужно будет использовать команду запуска репо для создания ветки темы, которая отслеживает ветку удаленного репо. Или вам нужно использовать параметр --track команды git branch, чтобы вручную создать локальную ветку с удаленной веткой отслеживания. Используйте параметр --set-upstream команды git branch для добавления ветви отслеживания в существующую локальную ветвь.

После того, как вы правильно настроили ветку трекинга, команда repo sync выполнит перемотку вперед и повторно применяет ваши локальные патчи, как описал Антон Черкашин в своем ответе.

Когда вы запускаете "repo sync", на самом деле происходит то, что каждый репозиторий git перезагружается в новом апстриме. Если у вас нет локальных исправлений в конкретном репозитории git, это просто перемотка вперед. Если у вас есть некоторые исправления, а также в апстриме (ваша ветка и ветка апстрима разошлись), репо попытается выполнить автоматическую перебазировку.

Допустим, у вас есть патч поверх вышестоящего кода, и у апстрима появилось несколько новых комитов с тех пор, как вы применили этот патч. Когда вы запускаете синхронизацию репо, репо будет пытаться перебазировать ваш код поверх апстрима. Если автоматическая перебазировка не удалась, репо выдаст сообщение об ошибке, сообщающее, что вы должны исправить патч вручную.

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

Другие вопросы по тегам