假设我正在从源代码构建 Android 或 CyanogenMod,并希望对其源代码进行更改。另外,假设我不想提交这些更改(例如,因为它们不完整或者是已被拒绝的更改)。
管理它的最佳方法是什么?我怎样才能对我的“个人”更改进行适当的源代码控制,但同时能够使用 repo sync 以便我拥有最新的更改?
我可以拥有本地分支(对于我进行更改的每个项目)并在每次 repo 同步后简单地从主分支合并到我的本地分支吗?
假设我正在从源代码构建 Android 或 CyanogenMod,并希望对其源代码进行更改。另外,假设我不想提交这些更改(例如,因为它们不完整或者是已被拒绝的更改)。
管理它的最佳方法是什么?我怎样才能对我的“个人”更改进行适当的源代码控制,但同时能够使用 repo sync 以便我拥有最新的更改?
我可以拥有本地分支(对于我进行更改的每个项目)并在每次 repo 同步后简单地从主分支合并到我的本地分支吗?
将 gerrit 与 repo 和 git 结合使用。
当您运行“repo sync”时,实际发生的是每个 git 存储库都重新基于一个新的上游。如果您在特定的 git 存储库中没有任何本地补丁,那么这是一个简单的快进。如果您确实有一些补丁并且上游也有(您的分支和上游分支已经分歧),repo 将尝试自动变基。
因此,假设您在上游代码之上有一个补丁,并且自从您应用该补丁以来,上游已经有了一些新的提交。当您运行 repo sync 时,repo 将尝试将您的代码重新设置在上游之上。如果自动变基失败,repo 将抛出一条错误消息,让您知道您应该手动修复补丁。
总结一下:您可以在要修改的每个项目中创建一个分支,将您的提交存储在该分支上。回购同步将自动重新定位您的补丁(除非它失败,然后您必须手动应用它们)。
您将需要使用 repo start 命令创建一个跟踪远程 repo 分支的主题分支。或者您需要使用 git branch 命令的 --track 选项手动创建具有远程跟踪分支的本地分支。使用 git branch 命令的 --set-upstream 选项将跟踪分支添加到现有本地分支。
正确设置跟踪分支后, repo sync 命令将快进并重新应用您的本地补丁,正如 Anton Cherkashyn 在他的回答中所描述的那样。
这似乎对我有用。
首先提到一些设置
# 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”也可以做到这一点。但是当我省略“repo sync -d”步骤并在签出 MyBranch 时只执行“repo sync”时,我似乎没有得到任何更新。(虽然也许我的本地设置以某种方式搞砸了)
总结一下:
选项A:可能有效
cd RootOfRepoSourceTree # wherever you have it
repo checkout MyBranch
repo sync
选项 B:对我始终有效
cd RootOfRepoSourceTree # wherever you have it
repo sync -d -j12
repo checkout MyBranch
repo sync