如何将更改从skeleton子存储库转换为生产超级存储库

时间:2016-06-29 10:38:07

标签: git aurelia

我正在使用包含各种项目设置的Aurelia skeleton用于不同目的,但它更像是一个关于如何使用git执行某些操作的一般问题,如下所述。

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

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

进行某种单向跟踪将是完美的,因为aurelia-skeleton远程存储库通常仅用于提取更改。

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

1 个答案:

答案 0 :(得分:5)

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

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

使用名为upstream

new 文件夹中名为skeleton-typescript的远程方法克隆项目的分支
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 API从命令行执行此操作,例如curl

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和friends将按预期工作。

git merge 095c0c9f7ed06726e9413030eca4050a969ad0af

但是,如果您已经向后选择了樱桃选择的更新,或者对子树历史记录进行了任何其他更改,那么您将要重新更改,否则您将有重复的提交。

git rebase 095c0c9f7ed06726e9413030eca4050a969ad0af