【问题标题】:How to properly manage changes to Android source?如何正确管理对 Android 源代码的更改?
【发布时间】:2013-05-03 21:39:30
【问题描述】:

假设我正在从源代码构建 Android 或 CyanogenMod,并希望对其源代码进行更改。另外,假设我不想提交这些更改(例如,因为它们不完整或者是已被拒绝的更改)。

管理它的最佳方法是什么?我怎样才能对我的“个人”更改进行适当的源代码控制,但同时能够使用 repo sync 以便我拥有最新的更改?

我可以拥有本地分支(对于我进行更改的每个项目)并在每次 repo 同步后简单地从主分支合并到我的本地分支吗?

【问题讨论】:

    标签: android git android-source repository cyanogenmod


    【解决方案1】:

    当您运行“repo sync”时,实际发生的是每个 git 存储库都重新基于一个新的上游。如果您在特定的 git 存储库中没有任何本地补丁,那么这是一个简单的快进。如果你确实有一些补丁并且上游也有(你的分支和上游分支已经分歧),repo 将尝试自动变基。

    假设您在上游代码之上有一个补丁,并且自从您应用该补丁以来,上游已经有了一些新的提交。当您运行 repo sync 时,repo 将尝试将您的代码重新设置在上游之上。如果自动变基失败,repo 将抛出错误消息,让您知道您应该手动修复补丁。

    总结一下:您可以在每个要修改的项目中创建一个分支,将您的提交存储在该分支上。回购同步将自动重新定位您的补丁(除非它失败,然后您必须手动应用它们)。

    【讨论】:

    • 我刚刚尝试过(创建一个分支并提交到该分支)。运行 repo sync 后,分支被保留,但它不会在我的本地分支上自动合并或重新定位上游。相反,它只是切换到上游。
    【解决方案2】:

    您将需要使用 repo start 命令创建一个主题分支来跟踪远程 repo 分支。或者您需要使用 git branch 命令的 --track 选项手动创建具有远程跟踪分支的本地分支。使用 git branch 命令的 --set-upstream 选项将跟踪分支添加到现有的本地分支。

    一旦您正确设置了跟踪分支,repo sync 命令将快进并重新应用您的本地补丁,正如 Anton Cherkashyn 在他的回答中所描述的那样。

    【讨论】:

      【解决方案3】:

      将 gerrit 与 repo 和 git 结合使用。

      【讨论】:

        【解决方案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”也可以做到这一点。但是当我省略“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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-26
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 2021-07-02
          • 2014-05-30
          • 1970-01-01
          • 2011-02-06
          相关资源
          最近更新 更多