【问题标题】:How to pull in changes from skeleton sub-repository into production super-repository如何将更改从骨架子存储库拉入生产超级存储库
【发布时间】:2017-09-28 07:51:54
【问题描述】:

我正在使用Aurelia skeleton,其中包含用于不同目的的各种项目设置,但它更像是一个一般性问题,即您将如何使用 git 进行如下所述的操作。

我希望能够将 GitHub 骨架存储库中发布的更新合并到我实际从事的项目中。你会怎么做?

目前,我刚刚在骨架打字稿项目(我正在使用)中初始化了一个新的本地存储库,并将其连接到私有远程存储库以推送我的更改。但是通过这种设置,我的项目特定更改污染了父存储库(远程指向 Github 上的 aurelia-skeleton)。

最好进行某种单向跟踪,因为 aurelia-skeleton 远程存储库通常仅用于拉入更改。

作为第二步,如何使用这样的设置创建拉取请求会很有趣。在这种情况下,我想使用我在子存储库中所做的更改来合并到 aurelia 远程的 fork...

【问题讨论】:

    标签: git aurelia


    【解决方案1】:

    我通常的工作流程是创建一个专门的分支来跟踪上游项目。您可以在该分支上挑选您想要的内容并创建拉取请求,而不会使模板与您的项目细节混淆。


    首先,继续 fork aurelia/skeleton-navigation,这样您就可以通过 Github 的 GUI 轻松发出拉取请求。

    在名为skeleton-typescript文件夹中使用名为upstream 的远程项目克隆您的项目分支

    git clone -o upstream git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git skeleton-typescript
    
    cd skeleton-typescript
    

    重命名主分支。

    git branch -m asmaster
    

    skeleton-typescript 创建一个新的存储库

    提示:您可以在命令行中使用Github's APIcurl 之类的东西直接执行此操作

    curl --data '{"name":"skeleton-typescript"}' -u YOUR_GITHUB_USERNAME https://api.github.com/user/repos
    

    添加遥控器。

    git remote add origin git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git
    

    将 repo 拆分为一个子树 (see source code for man page),其中将包含一个新树,其中包含 prefix 目录中文件的所有提交历史记录。

    git subtree split --prefix=skeleton-typescript
    

    这将打印出一个提交 ID,即子树的 HEAD

    539d913a8cf9b34b644273b5cdb480359553247c

    从该提交创建您的主分支。

    git checkout -b master 539d913a8cf9b34b644273b5cdb480359553247c
    

    推送并跟踪您的新存储库。

    git push -u origin master
    

    向后移植

    skeleton-typescript上提交一些工作

    echo "notable contribution" >> file.txt
    git add .
    git commit -m "backport test commit"
    git push origin master
    

    检查上游超级项目分支,并挑选子树提交。

    git checkout asmaster
    git cherry-pick -x --strategy=subtree master
    git push upstream asmaster:master
    

    现在您可以从上游分支YOUR_GITHUB_USERNAME/skeleton-navigation:master 分支向他们的aurelia/skeleton-navigation:master 分支发出拉取请求。

    更新中

    现在,毫无疑问,您的上游 (aurelia/skeleton-navigation:master) 将会更新,其中将包括对子树的 skeleton-typescript 文件夹的更新。

    添加另一个遥控器以跟踪原始项目。

    git remote add upupstream git@github.com:aurelia/skeleton-navigation.git
    

    请注意,您现在在本地存储库中有 3 个遥控器。

    git remote -v
    
    origin    git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git (fetch)
    origin    git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git (push)
    upstream  git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git (fetch)
    upstream  git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git (push)
    upupstream    git@github.com:aurelia/skeleton-navigation.git (fetch)
    upupstream    git@github.com:aurelia/skeleton-navigation.git (push)
    

    下拉更新。

    git checkout asmaster
    git pull upupstream master
    

    再次拆分子树并获取 HEAD 提交。

    git subtree split --prefix=skeleton-typescript
    

    095c0c9f7ed06726e9413030eca4050a969ad0af

    切换回子项目。

    git checkout master
    

    如果您从未向后移植更改,那么git subtree split 的一个显着属性是您将拥有完全相同的哈希提交历史记录,因此您可以在不重写历史记录的情况下快速向前合并。来自the docs

    完全相同的历史记录的重复拆分保证是相同的(即产生相同的提交 ID)。因此,如果您添加新提交然后重新拆分,新提交将作为提交附加到您上次生成的历史记录之上,因此 git merge 和朋友将按预期工作。

    git merge 095c0c9f7ed06726e9413030eca4050a969ad0af
    

    但是,如果您已经反向移植了精心挑选的更新,或对子树历史的任何其他更改,那么您需要重新设置更改,否则您将有重复的提交。

    git rebase 095c0c9f7ed06726e9413030eca4050a969ad0af
    

    【讨论】:

    • 首先非常感谢您的回答。这很有帮助,但我仍然遇到一些问题。我假设,我应该使用第一个命令克隆官方 aurelia 骨架项目,所以在我的情况下,它将是:git clone -o upstream git@github.com:aurelia/skeleton-navigation.git skeleton-typescript
    • 问题是,通过这样做,我克隆了包含所有不同项目设置的完整存储库,而不仅仅是打字稿,这可以用于创建拉取请求等并跟踪模板上的更改,但我不想在我的私有项目存储库中拥有整个存储库。
    • @MannikJ 啊,抱歉我没有查看存储库。你需要一个子树。我已经更新了我的答案。
    • 哇!我什至做梦都没有想到这么详尽的答案。感谢您的巨大努力。明天我会试一试,如果一切正常,我肯定会尝试。
    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2020-03-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多